如何评估嵌套的预处理器宏 [英] How to evaluate a nested preprocessor macro
问题描述
假设我想选择某个预处理器指令的行为,该指令在编译时评估一个常量字符串的连接和另一个宏的结果.
let's say I want to select the behaviour of a certain preprocessor directive evaluating at compile time the concatenation of a constant string and the result of another macro.
#define CASE1 text1
#define CASE2 text2
#define CASE3 text3
#define SCENARIO 3
/** the following won't work - for examplification purposes only**/
#define FUNCTION CASE##SCENARIO
/** whenever I write FUNCTION, I expect to see text3 **/
我很难想出一个可行的解决方案,因为预处理器是一次性的野兽.这甚至可行吗?
I am having an hard time thinking of a viable solution, as the preprocessor is a one-pass beast. Is that even feasible ?
推荐答案
有可能,你只需要添加一些额外的宏层.关键是当你使用标记粘贴操作符##
时,预处理器不会扩展它的操作数.但是,如果您添加另一层宏,预处理器将扩展这些参数.例如:
It's possible, you just need to add some extra layers of macros. The key is that when you use the token-pasting operator ##
, the preprocessor will not expand its operands. But, if you add another layer of macros, the preprocessor will expand those arguments. For example:
#define CASE1 text1
#define CASE2 text2
#define CASE3 text3
#define SCENARIO 3
#define TOKENPASTE_HELPER(x, y) x ## y
#define TOKENPASTE(x, y) TOKENPASTE_HELPER(x, y)
#define FUNCTION TOKENPASTE(CASE, SCENARIO)
当预处理器扩展 FUNCTION
时,它会扩展 TOKENPASTE
.当它扩展 TOKENPASTE
时,它扩展了它的参数(所以 SCENARIO
被 3
替换),因为它的参数都不是标记的操作数——粘贴运算符.接下来,它展开 TOKENPASTE_HELPER
,它执行实际的令牌粘贴以生成 CASE3
.最后,扩展CASE3
宏得到text3
.
When the preprocessor expands FUNCTION
, it expands TOKENPASTE
. When it expands TOKENPASTE
, it expands its arugments (so SCENARIO
gets replaced by 3
), since neither of its arguments are operands of the token-pasting operator. Next, it expands TOKENPASTE_HELPER
, which does the actual token pasting to make CASE3
. Finally, it expands the CASE3
macro to get text3
.
这篇关于如何评估嵌套的预处理器宏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!