проблема о различном обращении к __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? или мое использование попадает в неопределенное поведение?