將宏參數轉換為字串常值。參數名稱前加 #,展開時會被雙引號包圍。
#define P(A) printf("%s:%d\n", #A, A)
int a = 1, b = 2;
P(a); // 輸出: a:1
P(b); // 輸出: b:2
P(a+b); // 輸出: a+b:3
#define SQR(x) printf("The square of " #x " is %d.\n", (x)*(x))
SQR(8); // 輸出: The square of 8 is 64.
關鍵點:"The square of " #x " is %d.\n" 中相鄰字串常值會自動連接。
將兩個標記 (token) 連接成單一標記。常用於建構識別符名稱。
#define XNAME(n) x ## n
XNAME(8) // 展開為: x8
XNAME(var) // 展開為: xvar
#define CASE(x,y) case x: _bsd_setlasterror(anApplInstance, BSD_ ## y); break
CASE(1, EINVAL) // 展開: case 1: _bsd_setlasterror(..., BSD_EINVAL); break
+ ## + → ++ 合法;1 ## 2 → 12 合法;x ## + 非法###define DECLARE_FUNC(name) void name##_init(void); void name##_cleanup(void)
DECLARE_FUNC(foo)
// 展開: void foo_init(void); void foo_cleanup(void);
# 適合除錯輸出、日誌、錯誤訊息自動化## 適合程式碼生成、API 封裝、避免重複命名#pragma message 或編譯器 -E 查看展開結果