Макросы препроцессора как параметры для других макросов

Следующий код C++ компилируется и работает так, как задумано программистом в GCC (4.0.4)

#define FOO(x,y,z) ((x)*(y)*(z))
#define BAR(x) FOO(x,1)
#define BAZ 3,7

int main()
{
    return BAR(BAZ); /* interpreted as return ((3)*(7)*(1)); */
}

Однако макросы вызывают ошибку в Microsoft Visual C++ Express 2010:

main.cpp( 7): предупреждение C4003: недостаточно фактических параметров для макроса 'FOO'
main.cpp(7): ошибка C2059: синтаксическая ошибка: ')'

Проблема, по-видимому, заключается в том, что компилятор Microsoft при внутренней обработке макроса BAR не расширяет макрос BAZ до параметров, которые можно было бы использовать как два отдельные параметры для макроса FOO.

Согласно стандарту, какой компилятор правильно обрабатывает ситуацию?

12
задан Brian Tompsett - 汤莱恩 25 June 2016 в 21:41
поделиться