das Problem der unterschiedlichen Behandlung von __VA_ARGS__ bei Verwendung von VS 2008 und GCC
Ich versuche, ein Problem zu identifizieren, weil verschiedene Makros ungewöhnlich verwendet werden. Hier ist das hypothetische Makro:
#define va(c, d, ...) c(d, __VA_ARGS__)
#define var(a, b, ...) va(__VA_ARGS__, a, b)
var(2, 3, printf, “%d %d %d\n”, 1);
Für gcc gibt der Präprozessor @ au
printf("%d %d %d\n", 1, 2, 3)
Aber für VS 2008 ist die Ausgabe
printf, “%d %d %d\n”, 1(2, 3);
Ich vermute, der Unterschied wird durch die unterschiedliche Behandlung zu @ verursac VA_ARGS, für gcc wird zuerst der Ausdruck zu va (printf, "% d% d% d \ n", 1, 2, 3) erweitert und 1, 2, 3 als @ behandel VA_ARGS für Makro va. Aber für VS 2008 wird b zuerst als @ behandel VA_ARGS für Makro va und dann die Erweiterung durchführen.
Welche ist die richtige Interpretation für C99 variadic Macro? oder fällt meine nutzung in ein undefiniertes verhalten?