C/C++宏的使用技巧

自定义宏的使用技巧

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 ;
}
1
2
3
4
输出结果:
1
a
b

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 "-Werror=return-type"
#pragma GCC diagnostic ignored "-Wreturn-type"
int func() {

int x = 100;
}
#pragma GCC diagnostic pop

比如上面,对 func 函数临时关闭返回值检查


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!