ott*_*tto 12 c++ macros legacy-code c-preprocessor visual-studio-macros
下面的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的两个独立参数的参数.
根据标准,哪个编译器正确处理了这种情况?
Ale*_*lin 13
根据ISO/IEC 14882:2003(C++ Stardard)的16.3.4,宏扩展如下进行:
您指定的代码的步骤顺序如下:
BAR(BAZ)FOO(3,7,1)((3)*(7)*(1))所以海湾合作委员会是对的,VC不是.但VC抱怨的错误是FOO有3个参数并且BAR只指定其中的2个.VC显然试图尽快发现错误并且有点太过分了.