下面的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)); */
}
Run Code Online (Sandbox Code Playgroud)
但是,宏在Microsoft Visual C++ Express 2010上导致错误:
main.cpp(7):警告C4003:宏'
FOO'main.cpp(7)的实际参数不够:错误C2059:语法错误:')'
问题似乎是Microsoft编译器在内部处理BAR宏时,不会将BAZ宏扩展为可用作宏FOO的两个独立参数的参数.
根据标准,哪个编译器正确处理了这种情况?