预处理程序令牌扩展
我对预处理器如何工作的心理模型显然是不完整的,这让我发疯。
我想连接两个标记,但第二个标记应该首先扩展。
#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