C/C++ 防止宏内部的宏扩展

bra*_*min 5 c++ macros

让我们考虑一下:

#define PARENTHESIS1 (
#define PARENTHESIS2 )
#define macro_test_0(arg1, arg2) int arg1 arg2
#define macro_test_1(arg1, arg2) macro_test_0(arg1, arg2)

macro_test_0(PARENTHESIS1, PARENTHESIS2 ;) //->works fine
macro_test_1(PARENTHESIS1, PARENTHESIS2 ;) //doesn't work
Run Code Online (Sandbox Code Playgroud)

对于macro_test_1,我有错误消息:“宏参数不匹配”、“为类似函数的调用方法提供的参数太少”、“使用未声明的标识符‘macro_test_0’”。

事情是,对于 Macro_test_0,示例给出:

int ( ) ;
Run Code Online (Sandbox Code Playgroud)

没关系,但是 Macro_test_1 示例给出了(如果我是正确的):

macro_test_0((,) ;)
Run Code Online (Sandbox Code Playgroud)

这显然是错误的。我希望宏的 arg1 和 arg2 防止扩展,以便保留:

macro_test0(PARENTHESIS1, PARENTHESIS2 ;)
Run Code Online (Sandbox Code Playgroud)

我猜这与宏扩展顺序有关,但是有没有办法或技巧来实现这一点?我尝试了几种方法,例如在宏调用期间人工(即无用)参数串联来延迟扩展,但没有成功。

try*_*000 0

我不知道你使用哪个编译器或 IDE。

但对于 Visual Studio 2012:两条线在预处理后生成相同的代码

int ( ) ; 
int ( ) ; 
Run Code Online (Sandbox Code Playgroud)

对于 vs:

'src file' 属性 -> C/C++/Preprocessor -> 预处理到文件

选项将预处理后输出代码到文件

GCC 有类似的编译选项。