预处理程序令牌扩展

时间:2010-11-26 11:07:48

标签: c++ c c-preprocessor

我对预处理器如何工作的心理模型显然是不完整的,这让我发疯了。

我想连接两个标记,但第二个标记应该首先扩展。

#define ANSWER 42

#define FOO foo_ ## ANSWER

此处,FOO扩展为foo_ANSWER,但我希望它为foo_42。所以我定义了一个MERGE宏,希望在串联之前以某种方式扩展参数:

#define MERGE(x, y) x ## y

#define BAR MERGE(bar_, ANSWER)

BAR仍然扩展为bar_ANSWER而不是bar_42。所以我定义了另一个宏HELPER

#define HELPER(x, y) MERGE(x, y)

#define BAZ HELPER(baz_, ANSWER)

现在BAZ已成功扩展为baz_42。目前,这对我来说似乎很神奇。

任何人都可以向我解释这种行为吗?扩展规则如何正常工作?

2 个答案:

答案 0 :(得分:8)

阅读问题here的答案:

  

问题是当你有一个   宏替换,预处理器   只会扩展宏   如果没有字符串化,则递归递归   operator#也不是令牌粘贴   运算符##适用于它。那么你   必须使用一些额外的层   间接,你可以使用   带有一个令牌粘贴操作符   递归扩展参数

答案 1 :(得分:3)

在执行串联[ref]时,令牌连接不会扩展宏。

为了解决这个问题,你需要使用一个间接级别,并让预处理器在连接之前扩展宏。

#define STEP1(x, y)    STEP2(x, y)    // x and y will be expanded before the call to STEP2
#define STEP2(x, y)    x ## y         // x and y will not be expanded, just pasted