[英]How to evaluate a nested preprocessor 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 **/
我很難想到一個可行的解決方案,因為預處理器是一次通過的野獸。 這甚至可行嗎?
這是可能的,你只需要添加一些額外的宏層。 關鍵是當你使用令牌粘貼操作符##
,預處理器不會擴展其操作數。 但是,如果添加另一層宏,預處理器將擴展這些參數。 例如:
#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
,它會擴展它的arugments(因此SCENARIO
被3
替換),因為它的參數都不是令牌粘貼操作符的操作數。 接下來,它擴展了TOKENPASTE_HELPER
,它執行實際的令牌粘貼以生成CASE3
。 最后,它擴展了CASE3
宏以獲得text3
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.