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
typedef void (*HANDLER) (int);
1)HANDLER signal(int, HANDLER);
复制代码
展开后是:
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