关于APUE信号章节signal函数嵌套函数指针声明的语法疑问
解析UNIX信号函数
signal的声明 先把你提到的声明贴出来:
void (*signal(int signo, void (*func)(int)))(int);
咱们拆解这个声明,得按C语言的规则来——从内向外、结合括号优先级逐步分析:
先看已知的部分:
void (*func)(int)
你已经理解这个是函数指针:它指向的是一个**接受int类型参数、返回void**的函数,这是signal的第二个参数。分析
signal本身的函数身份:
看signal(int signo, void (*func)(int)),这说明signal是一个函数,它有两个参数:- 第一个参数是
int类型的signo(信号编号) - 第二个参数就是上面说的函数指针
func
- 第一个参数是
最后看末尾的
(int)和外层的指针声明:
外层的void (*...)(int)是在描述signal的返回值:signal的返回值是一个指针,这个指针指向的函数同样是**接受int类型参数、返回void**的。末尾的(int)就是这个返回函数指针所指向函数的参数列表。
用typedef简化声明
如果觉得这种嵌套写法太绕,可以用typedef给函数指针起别名,让声明更直观:
typedef void (*sigfunc)(int); sigfunc signal(int signo, sigfunc func);
这样一眼就能看明白:signal是个函数,接受int和sigfunc类型的参数,返回值也是sigfunc类型(也就是那个函数指针)。
内容的提问来源于stack exchange,提问作者Paul CyberCitizen
相关产品推荐
相关产品推荐

