预处理程序令牌扩展

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

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

#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 。 目前,这对我来说似乎很神奇。

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

在这里阅读你的问题的答案:

问题是当你有宏替换时,如果字符串化操作符#和令牌粘贴操作符##都没有应用于它,预处理器将只递归地扩展宏。 因此,您必须使用一些额外的间接层,您可以使用带有递归扩展参数的token-pasting运算符

执行串联[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