【发布时间】:2012-05-27 21:21:10
【问题描述】:
以下 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 的两个单独参数的参数。
按照标准,哪个编译器能正确处理这种情况?
【问题讨论】:
-
看来你真正要找的是variadic macros。
-
@leftaroundabout 好像他不是……
-
@iammilind:标准第 16 章缺少什么?它怎么不是一个“真正的”标准?
-
@iammilind 当然可以。它旨在允许在实现中留出一些余地,并且某些涉及令牌粘贴的操作会导致未定义的行为,但这里不是这种情况。 (通常,在存在未定义行为的情况下,g++ 会发出错误信号,而大多数其他编译器都会接受它。)
-
@CharlesBaily,你是对的。删除 cmets(登录 PC 后)。
标签: c++ macros c-preprocessor legacy-code visual-studio-macros