首页 > 技术文章 > 宏定义&CodeBlocks&Glib

xuybin 2013-07-06 19:06 原文

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

推荐阅读