为什么在宏##操作的定义中有2级间接

PJ.*_*des 4 c c++ concatenation c-preprocessor

在下面的宏定义中,在真正的粘贴操作之前有两个间接级别:

#define MACRO_JOIN(a, b)  MACRO_JOIN1(a, b)
#define MACRO_JOIN1(a, b) MACRO_JOIN2(a, b)
#define MACRO_JOIN2(a, b) a##b
Run Code Online (Sandbox Code Playgroud)

我知道我们需要MACRO_JOIN1它,因为它没有粘贴或字符串化,所以它的参数可以先扩展.

但第二个间接的目的到底是什么MACRO_JOIN?什么情况MACRO_JOIN会起作用但MACRO_JOIN1会失败?

小智 6

强制进行额外扩展可能会产生差异,初始扩展会导致可以进一步扩展的内容.一个简单的例子,给出:

#define MACRO(x) x
#define EXPAND(x) x
#define NOEXPAND()
Run Code Online (Sandbox Code Playgroud)

是:

MACRO NOEXPAND() (123)
Run Code Online (Sandbox Code Playgroud)

这扩展到MACRO (123).另一方面,如果你强制进行额外扩展,如下所示:

EXPAND(MACRO NOEXPAND() (123))
Run Code Online (Sandbox Code Playgroud)

结果是:

123
Run Code Online (Sandbox Code Playgroud)

通常情况下,强制执行这样的额外扩展是不必要的:任何会导致这种情况产生任何差异的宏定义通常被认为是糟糕的风格.但是对于某些特定的输入,它可能是有用的.

所以对于你的具体例子MACRO_JOIN:

MACRO_JOIN(123, MACRO NOEXPAND() (456)) // expands to 123456
MACRO_JOIN1(123, MACRO NOEXPAND() (456)) // expands to 123MACRO (456)
Run Code Online (Sandbox Code Playgroud)