Define可变参数解决函数特殊条件判断

在写c/c++程序的时候,经常要处理很多异常的情况,我们希望设计一个通用的判断错误的功能:

  1. 能够在函数内部返回值
  2. 能够打印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
#include <stdio.h>

#define ERROR_LOG(expr, ret, msg, args...) do{ \
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]

这样设计的好处是,宏直接在函数中展开,可以返回值,使得代码更加简洁
另外:

  1. 为什么要使用do while(0)请参考:@stackoverflow.
  2. define中,单个#表示使后面的参数变为字符串,而##表示两个参数拼接成字符串.
------ 本文结束 ------
k