#include <stdio.h>
#define FP_SAFE_RUN(fp, args...) (void)((fp) && ((fp)(args), 0))
void add(int a, int b)
{
printf("%d + %d = %d\n",a, b, a+b);
}
void (*g_fp_calc )(int, int) = add;
int main(int argc, char *argv[])
{
FP_SAFE_RUN(g_fp_calc, 1, 2);
//g_fp_calc(1,2);
return 0;
}
等价于
if(g_fp_calc)
{
g_fp_calc(1, 2);
}
这里涉及三个知识点:短路表达式,变参数宏,函数表达式
fp如果为空,&&运算直接返回结果,所以不会执行fp();
GNUC支持该写法;
若函数返回值为void或结构体等,无法转化为逻辑值,无法使用短路表达式。可以加",0",使整个表达式和0等价。
加(void)代表不关心表达式的返回值,消除警告。