c++宏调用不当终止

C++ Macro improperly terminated macro invocation

本文关键字:终止 调用 c++      更新时间:2023-10-16

在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中编译失败并出现错误:语法错误:')'智能感知:宏调用不正确终止

我认为这是不可能的。C预编译器以深度优先的方式展开宏,因此在考虑MACROC2之前,MACROC1就已经完全展开了。然后,它将找到带有不完整参数列表的MACRO,并抛出一个错误。

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

您的代码将翻译为:

int foo = MACRO(1, 2;

这是错误的-这是一个不完整的(不正确终止的)宏调用宏。

相关文章: