首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 前置處理器 # 與 ## 運算子完整教學與進階技巧

     編輯:關於C語言

基本用法

  • #(字串化運算子):將宏參數轉為字串常值。
    範例:#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"

進階應用範例

  1. 匿名變數產生:#define ANONYMOUS(type) type _anonymous##__LINE__
  2. 結構體初始化填充:#define FILL(a) {a, #a} 可自動產生 {OPEN, "OPEN"}。
  3. 編譯期取得檔名字串:#define GET_FILE_NAME(f) _GET_FILE_NAME(f) 配合 __FILE__。
  4. 數值型別對應的字串緩衝區大小:#define TYPE_BUF_SIZE(type) sizeof #type。

重點提醒

善用雙層宏(轉換宏)可解決參數預先展開問題,是撰寫健壯巨集的關鍵技巧。

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