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

C 宏進階:# 字符串化 與 ## 標記粘連 實戰技巧

     編輯:關於C語言

雙井號操作符速查

操作符名稱功能示例
#Stringification參數 → 字符串字面量#x → "x"
##Token Pasting兩標記合並為一標記a##b → ab

經典應用場景

1. 自動生成命令表(字符串化 + 粘連)

void quit_cmd()  { puts("quit"); }
void help_cmd()  { puts("help"); }

#define CMD_ENTRY(name) { #name, name##_cmd }

struct cmd { const char *name; void (*fn)(); } cmds[] = {
    CMD_ENTRY(quit),
    CMD_ENTRY(help),
};

/* 展開後:
   { "quit", quit_cmd },
   { "help", help_cmd }
*/

2. 調試打印宏(變量名 + 值)

#define PRINT_VAR(x) printf(#x " = %d\n", x)

int token9 = 9;
PRINT_VAR(token9);  // 展開:printf("token9" " = %d\n", token9); → token9 = 9

3. 避免宏參數副作用的陷阱

#define SQUARE(x) ((x)*(x))  // 參數加括號!
SQUARE(i++);  // 正確:((i++)*(i++)) → 仍有副作用,建議改用 inline 函數

預處理器調試技巧

gcc -E -P source.c  # 僅輸出預處理結果,無行號標記
clang -Xclang -macro-expand  # 交互式宏展開

標準庫中的實際應用

  • assert(expr) → #expr 保留表達式文本
  • offsetof(type, member) → 結合 ## 計算偏移
  • X-Macros:列表宏 + 多次包含生成枚舉/數組/switch
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved