Chinaunix

标题: 请教大家一个函数定义的问题! [打印本页]

作者: sublx    时间: 2012-12-02 22:37
标题: 请教大家一个函数定义的问题!
signal函数的定义是这样:

typedef void (*HANDLER) (int);

1)HANDLER signal(int, HANDLER);

展开是不是相当于这样:

2)void (*fp)(int) signal(int, void(*)(int));

其中第一个 void (*fp)(int) 是返回值,第二个是参数。

但是 为什么上面的2)可以和下面的定义等价:

void (*signal(int, void(*)(int)))(int);

这样写不好理解啊,这个跟:void (*fp)(int) signal(int, void(*)(int)); 是一样的?还是void (*fp)(int) signal(int, void(*)(int));这样写发不对?

谢谢!
作者: linux_c_py_php    时间: 2012-12-02 23:04
知道怎么回事就行了, 正常人都不会这么折腾的, 让不让人读他代码了.
作者: pmerofc    时间: 2012-12-02 23:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: sublx    时间: 2012-12-02 23:37
回复 3# pmerofc



typedef void (*HANDLER) (int);

HANDLER signal(int, HANDLER);

这个展开不是差不多这个形式吗?

void (*handler) (int) signal(int, void (*handler)(int));

我是觉得这样写才符合像一般函数的那种定义。

void (*signal(int, void(*)(int)))(int);这样写真不好理解。


   
作者: pmerofc    时间: 2012-12-02 23:42
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2012-12-02 23:44
提示: 作者被禁止或删除 内容自动屏蔽
作者: sublx    时间: 2012-12-03 00:05
回复 6# pmerofc


我的意思其实是想说,typedef void (*HANDLER)(int) ,handler是一个函数指针,假设signal返回不是一个函数指针,第二个参数也不是函数指针,假设两个都是char *,那么signal的原型不是像这样定义 :

char * signal(int, char *);

现在signal 返回来的是一个函数指针,没有想上面这种这么通俗的写法吗,比如:

void (*)(int) signal(int ....

写成这样, void (*signal(int, void (*)(int)))(int); 比较难理解啊。

   
作者: pmerofc    时间: 2012-12-03 10:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: flw    时间: 2012-12-03 10:54
一般都是用 typedef 来简化帮助理解复杂的类型声明,
你怎么正好反过来了?用复杂的类型声明来理解 typedef?
作者: folklore    时间: 2012-12-03 11:17
@sublx
  1. typedef void (*HANDLER) (int);

  2. 1)HANDLER signal(int, HANDLER);
复制代码
展开后是:
  1. void (*) (int) signal(int, void (*) (int));
复制代码

作者: sqfasd    时间: 2012-12-03 12:44
建议lz去读读《c专家编程》第三章,和c标准文档的6.7.5小节。在此大致总结下我的理解:
1.c语言的祖先BCPL语言中几乎是没有类型的,这导致了c语言先天有缺陷
2.编译器喜欢(或认为简单)的语法,在一般的程序员这里可能会造成障碍
3.c语言有一种设计哲学,要求对象的声明与使用形式尽可能相似。(但这个哲学至今还是有争议的= =)这导致了无法以人们所习惯的自然的方式从左到右去读一个声明。
比如lz所说的void (*signal(...))(int);
省略表示signal函数复杂的形参列表,这个好理解,关键在于为什么返回的函数指针()后缀放在函数声明符的后面,而不是前面
c语言认为这个函数的使用方式应该是这样的,先调用signal函数,返回值为一个指针rv,然后表达式就成了这样void (*rv)(int);
很显然这是个函数指针,通过解引用,就可以进行函数调用。c语言的设计者认为这样就保证了使用和声明在形式上是一致的
作者: Sevk    时间: 2012-12-03 13:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: sublx    时间: 2012-12-03 22:08
sqfasd 发表于 2012-12-03 12:44
建议lz去读读《c专家编程》第三章,和c标准文档的6.7.5小节。在此大致总结下我的理解:
1.c语言的祖先BCPL ...


这样解析貌似比较合理。{:2_172:}  3Q 不过我觉得还是写成这样好理解

void (*)(int) signal(int, void(*)(int));

跟普通函数定义是一样的,脑子都不用转弯就可以明白了
作者: sublx    时间: 2012-12-03 22:14
回复 11# sqfasd


你的记性真好,拜一个

   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2