#(字串化運算子):將宏參數轉為字串常值。#define STR(s) #s → STR(vck) 展開為 "vck"。##(黏著運算子):將兩個記號連接成單一記號。#define CONS(a,b) int(a##e##b) → CONS(2,3) 展開為 int(2e3)(即 2000)。當宏定義中出現 # 或 ## 時,對應參數不會先行展開。例如:
#define A 2
#define STR(s) #s
STR(A) // 展開為 "A",而非 "2"
解決方法:加入中間轉換宏,強制先展開參數:
#define _STR(s) #s
#define STR(s) _STR(s)
STR(A) // 正確展開為 "2"
#define ANONYMOUS(type) type _anonymous##__LINE__#define FILL(a) {a, #a} 可自動產生 {OPEN, "OPEN"}。#define GET_FILE_NAME(f) _GET_FILE_NAME(f) 配合 __FILE__。#define TYPE_BUF_SIZE(type) sizeof #type。善用雙層宏(轉換宏)可解決參數預先展開問題,是撰寫健壯巨集的關鍵技巧。