C ++宏不正确地终止宏调用

时间:2011-07-28 21:54:12

标签: c++ definition c-preprocessor

在C ++中是否有一种机制允许表达非终止宏? 这是一个人为的例子:

#define MACRO(x, y) x + y
#define MACROC1(x) MACRO(x, 
#define MACROC2(y) y)
//...expecting 3
int foo = MACROC1(1) MACROC2(2);

我收到错误地从MSVC终止宏调用的错误。

当我运行 cl -E file.cpp 时,我看到已生成以下代码:

int c = 1 + 1 +  2);

在visual studio中编译失败并出现错误: 错误C2059:语法错误:')' IntelliSense:不正确地终止宏调用

2 个答案:

答案 0 :(得分:5)

我不认为这是可能的。 C预编译器首先扩展宏深度,因此MACROC1将在MACROC2被考虑之前完全展开。然后,它将找到带有和不完整参数列表的MACRO并抛出错误。

一般来说,您应该避免定义构建其他宏调用的宏。编制者倾向于不同意这些意思。

答案 1 :(得分:1)

您的代码将转换为:

int foo = MACRO(1, 2;

哪个错误 - 它是宏MACRO的不完整(不正确终止)调用。