Следующий код С++ компилируется и работает как программист, предназначенный для 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 С++ Express 2010:
main.cpp(7): предупреждение C4003: недостаточно фактических параметров для макроса "FOO"
main.cpp(7): ошибка C2059: синтаксическая ошибка: ')'
Проблема заключается в том, что компилятор Microsoft при обработке макроса BAR внутренне не расширяет макрос BAZ до параметров, которые могут использоваться как два отдельных параметра для макроса FOO.
В соответствии со стандартом, какой компилятор правильно справляется с ситуацией?