C陷阱与缺陷中的一个问题——signal函数声明的剖析

在《C陷阱与缺陷》这本书的第2.1节“理解函数声明”中,作者通过对函数声明的一步步分析、引导、深入,最后得到一个signal函数:



但是,当我第一次看到的时候也觉得没法理解,看过好多遍之后还是没法理解。这几天看《C++Primer》,突然明白了,所以就赶紧记录下来。


我记得以前我在CSDN论坛上提过一个问题:请问signal函数如何调用?其实,如果理解了signal函数的定义,又怎能问这样肤浅的问题?


下来我来分析一下signal函数

signal函数

参数:1)int。

            2)一个返回值为void,带一个int参数的函数指针。

返回值:

    一个返回值为void,带一个int参数的函数指针。


下来我们从函数指针的声明来剖析:  void (*(signal)(int,void(*)(int)))(int) 

1)既然这是一个函数声明,那么就先从最里层函数名signal来看。void (*(signal)(int,void(*)(int)))(int) 

可以看出:signal带int和void(*)(int)两个参数   void (*(signal)(int,void(*)(int)))(int) 

2)如果能理解第一步,那么第二步就很好理解了。

你看以这样看这个声明 void (*(signal)(int,void(*)(int)))(int) 

将绿色的部分看成一个整体就变成了 void (*p)(int) 

p带了一个*,那么p的返回值肯定是指针了,是什么类型的指针呢?看看指针形式, void (*)(int) 为其类型!!!

(以上所有如果还有疑问,请继续看《C陷阱与缺陷》此节)

所以,就成了 void (*(signal)(int,void(*)(int)))(int) 

你看,如果用typedef的话就很明了了,对吧!


如何调用?简单!


我做了两个小例子

#if 0
#include <stdio.h>

/*
typedef void (*HANDLER)(int);
HANDLER signal(int,HANDLER);
*/

void (*mysignal(int a,void(*p)(int)))(int)
{
	printf("x = %d\n",a);
	p(a);
	return p;
}

void fun(int x)
{
	printf("y = %d\n",x);	
}
int main(void)
{
	mysignal(1,fun);
}

#endif

#include <stdio.h>

int (*myfun(int (p)(int x,int y),int x,int y))(int x,int y)
{
	printf("x = %d\n",x);
	printf("y = %d\n",y);
	printf("x + y = %d\n",p(x,y));
	return p;
}

int add(int x,int y)
{
	return x + y;
}

int main(void)
{
	printf("myfun的返回值 = 0x%x\n",myfun(add,4,7));
	printf("add函数的地址 = 0x%x\n",add);
}



 

如果能用typedef,必须要用!不然代码很晦涩,增加维护成本!!!







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值