一、gcc的參數中
-Dmacro 等價於代碼裡 #define macro
-Dmacro=value 等價於代碼裡 #define macro value
-Umacro 等價於代碼裡 #undef macro
二、宏定義時 ,
斜槓(
"\")是用來續行,
"
#
"用來把參數轉換成字符串,是給參數加上雙引號。
"
##
"則用來連接前後兩個參數,把它們變成一個字符串,
"
#@"是給參數加上單引號。
例如
#define Conn(x,y) x##y
#define ToChar(a) #@a
#define ToString(x) #x
int
n = Conn(123,456);
結果n=123456;
char
* str = Conn(
"asdf"
,
"adf"
)
結果str =
"asdfadf"
;
char
a = ToChar(1);
結果
a='1'
;
char
* str = ToString(123132);
結果
str="123132"
;
三、在CodeBlocks裡使用-D定義值為字符串的宏,存在Bug
如:定義Glib的G_LOG_DOMAIN的日志域宏時,在編譯選項裡加入
-DG_LOG_DOMAIN="plugin_dispatch" 構建時提示 plugin_dispatch未定義,明顯是宏預處理時,把雙引號丟掉了。
解決辦法是使用gmacros.h的#define G_STRINGIFY_ARG(contents) #contents
G_LOG_DOMAIN=G_STRINGIFY_ARG(plugin_dispatch)
構建提示syntax error near unexpected token `('
改成G_LOG_DOMAIN="G_STRINGIFY_ARG(plugin_dispatch)"構建成功