Следующий код 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.
Согласно стандарту, какой компилятор правильно обрабатывает ситуацию?