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