以下 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 的两个单独参数的参数。
根据标准,哪个编译器正确处理这种情况?