函数指针调用

#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)代表不关心表达式的返回值,消除警告。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值