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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage