代碼中定義:
#define _STR(x) #x
#define _VAL(x) _STR(x)
#define MACRO _VAL(__LINE__)
疑惑:直接 #define MACRO #__LINE__ 不行嗎?
C 預處理器對宏參數採用「先展開參數,再代入替換」策略,但 # (字符串化) 和 ## (連接) 操作符會阻止參數預展開。
#__LINE__ 直接字符串化 → "__LINE__"(字面量),而非行號數字。_VAL(x),參數 x 先被展開為行號(如 123),再傳給 _STR 字符串化 → "123"。編譯時加 -E 參數(gcc -E test.c),查看預處理輸出,直觀看到展開結果差異。
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define VERSION 1.2.3
const char* version = TOSTRING(VERSION); // 得到 "1.2.3" 而非 "VERSION"
雙層宏是「延遲字符串化」的標準模式,記住:外層展開參數,內層字符串化。