проблема о различном обращении к __VA_ARGS__ при использовании VS 2008 и GCC

Я пытаюсь определить проблему из-за необычного использования макросов variadic. Вот гипотетический макрос:

#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);

Для gcc препроцессор выведет

printf("%d %d %d\n", 1, 2, 3)

но для VS 2008, выход

printf, “%d %d %d\n”, 1(2, 3);

Я подозреваю, что разница вызвана различнымva_argsдля gcc сначала он расширит выражение до va (printf, "% d% d% d \ n", 1, 2, 3), и обработает 1, 2, 3 какva_args для макро ва. Но для VS 2008 это сначала будет относиться к b какva_args для макроса ва, а затем сделать расширение.

Какая правильная интерпретация для вариабельного макроса C99? или мое использование попадает в неопределенное поведение?

Ответы на вопрос(2)

Ваш ответ на вопрос