在写c/c++程序的时候,经常要处理很多异常的情况,我们希望设计一个通用的判断错误的功能:
- 能够在函数内部返回值
- 能够打印log
define可以实现此功能,因为宏具有可以将代码展开的功能,因此能够实现return的功能。我们看个例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if (expr) { \
fprintf(stdout, msg, ## args); \
return ret; \
} \
} while(0)
int fun(int a) {
ERROR_LOG(a < 5, -1, "a < 5 is forbidden! a= [%d] \n", a);
return 0;
}
int main() {
int res = fun(3);
printf("res=[%d]\n", res);
res = fun(6);
printf("res=[%d]\n", res);
return 0;
}
这段代码的输出是:
a < 5 is forbidden! a= [3]
res=[-1]
res=[0]
这样设计的好处是,宏直接在函数中展开,可以返回值,使得代码更加简洁
另外:
- 为什么要使用do while(0)请参考:@stackoverflow.
- define中,单个#表示使后面的参数变为字符串,而##表示两个参数拼接成字符串.