C ++宏未正确终止的宏调用

MW_*_*dev 3 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);
Run Code Online (Sandbox Code Playgroud)

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

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

int c = 1 + 1 +  2);
Run Code Online (Sandbox Code Playgroud)

在Visual Studio中,编译失败并显示以下错误:错误C2059:语法错误:')'IntelliSense:不正确终止的宏调用

rod*_*igo 5

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

一般来说,应该避免定义用于构建其他宏调用的宏。编译器往往不同意这些意思。