一、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) #xint 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)"构建成功