首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言雙層宏展開技巧:為什麼需要 _STR 和 _VAL 兩層?

     編輯:程式設計疑難解答

現象

代碼中定義:

#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"

雙層宏是「延遲字符串化」的標準模式,記住:外層展開參數,內層字符串化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved