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

时间:2016-07-23 18:56:20

标签: 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

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

但第二次间接MACRO_JOIN的目的究竟是什么?在什么情况下MACRO_JOIN会起作用,但MACRO_JOIN1会失败?

1 个答案:

答案 0 :(得分:6)

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

#define MACRO(x) x
#define EXPAND(x) x
#define NOEXPAND()

是:

MACRO NOEXPAND() (123)

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

EXPAND(MACRO NOEXPAND() (123))

结果:

123

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

关于MACRO_JOIN的具体示例:

MACRO_JOIN(123, MACRO NOEXPAND() (456)) // expands to 123456
MACRO_JOIN1(123, MACRO NOEXPAND() (456)) // expands to 123MACRO (456)