自定义宏的使用技巧
1、在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义
2、 用来换行 3、 # 把变量变为字符串
1.在switch中使代码更简洁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| string func(int level){ switch(level){ #define XX(i,name) \ case i: \ return name; \ XX(1,"DEBUG") ; XX(2,"INFO") ; XX(3,"WARN") ; XX(4,"ERROR") ; XX(5,"FATAL") ; #undef XX default: return "UNKNOW" ; } return "UNKNOW" ; }
|
2.把变量变为字符串
1 2 3 4 5 6 7 8
| int main(){ #define STRING(x) (#x) cout<<STRING(1)<<endl; int a = 1000 ; cout<<STRING(a)<<endl; cout<<STRING(b)<<endl; return 0 ; }
|
3.打印宏定义内容
通过预处理指令 #pragma message(宏),将宏定义内容打印到标准输出,
由于宏定义只是一种文本表示,并不是字符串类型,因此如果宏定义的内容为
“v0.0.1” 这种形式,message 会有如下报错: 1
| <command-line>: error: too many decimal points in number
|
因此需要将宏的内容转为字符串类型,所以 #pragma message 通常与把变量变为字符串搭配使用
1 2
| #define STRING(x) (#x) #pragma message(STRING(PROJETCT_VERSION));
|
预定义宏的使用技巧
1.对某段代码临时打开或关闭某个编译选项
1 2 3 4 5 6 7 8
| #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wreturn-type" int func() {
int x = 100; } #pragma GCC diagnostic pop
|
比如上面,对 func 函数临时关闭返回值检查