一、gcc的参数中
-Dmacro 等价于代码里 #define macro
-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)"构建成功