| 參數 | 等價代碼 | 說明 |
|---|---|---|
-Dmacro | #define macro | 定義宏,值為 1 |
-Dmacro=value | #define macro value | 定義帶值宏 |
-Umacro | #undef macro | 取消宏定義 |
#param 將參數轉為字符串字面量(加雙引號)。token1 ## token2 合併為單個語言符號。#@param 加單引號(GCC 擴展,非標準)。#define Conn(x, y) x ## y
#define ToChar(a) #@a
#define ToString(x) #x
int n = Conn(123, 456); // n = 123456
char *s = Conn("asdf", "adf"); // s = "asdfadf"
char c = ToChar(1); // c = '1'
char *str = ToString(123132); // str = "123132"
在 CodeBlocks 編譯選項中添加:
-DG_LOG_DOMAIN="plugin_dispatch"
構建報錯:plugin_dispatch 未定義。預處理器誤將雙引號丟失,導致宏展開為 #define G_LOG_DOMAIN plugin_dispatch(無引號標識符)。
CodeBlocks 解析編譯選項時,未正確處理雙引號轉義,導致傳遞給 GCC 的實際參數丟失引號。
// glib/gmacros.h 定義
#define G_STRINGIFY_ARG(contents) #contents
// 正確寫法
-DG_LOG_DOMAIN=G_STRINGIFY_ARG(plugin_dispatch)
預處理過程:
1. G_STRINGIFY_ARG(plugin_dispatch) → "plugin_dispatch"
2. G_LOG_DOMAIN="plugin_dispatch" → 正確帶引號定義
編譯時加 -E 只預處理輸出,檢查宏展開結果:
gcc -E -DG_LOG_DOMAIN=G_STRINGIFY_ARG(plugin_dispatch) test.c | grep G_LOG_DOMAIN
config.h:#define G_LOG_DOMAIN "plugin_dispatch",構建系統僅控制是否包含該標頭或定義簡單標識符(如 -DHAVE_CONFIG_H)。target_compile_definitions 配合 configure_file 生成配置頭,完全規避命令行轉義問題。G_STRINGIFY、G_STRINGIFY_ARG)保證語義一致性。