MINIX 1.5中signal函数指针式声明解析及类型转换疑问
解析MINIX 1.5中signal函数的复杂声明
这不是类型转换,是返回函数指针的函数声明
你看到的写法是老C标准里用来声明返回函数指针的函数的语法,和类型转换完全无关。这种嵌套式写法看起来容易混淆,但拆解后逻辑很清晰。
分步拆解原型声明
原声明:
void (*signal(int sig, void (*_func)(int) )) (int);
从内到外拆解:
- 函数参数部分:
signal(int sig, void (*_func)(int))signal是函数名,第一个参数是int类型的sig(信号编号);- 第二个参数
void (*_func)(int)是一个函数指针:它指向的函数接受一个int参数,没有返回值(这是信号处理函数的标准签名)。
- 返回值部分:
void (*...) (int)- 外层结构表示:
signal函数的返回值是一个函数指针,这个指针指向的函数同样是“接受int参数、无返回值”的类型——用来返回之前注册的旧信号处理函数。
- 外层结构表示:
对应函数定义的解释
代码文件里的定义:
PUBLIC void (*signal(int signr, void (*func)(int))) (int){ void (*old) (int); /* 其他逻辑 */ return(old); }
PUBLIC是MINIX专属关键字,标记全局可见的函数;- 变量
void (*old)(int)是和返回值类型完全匹配的函数指针,用来保存旧的信号处理函数,最终返回它,完全符合原型要求。
简化写法(typedef优化)
嵌套的函数指针声明可以用typedef简化,可读性大幅提升,效果和原声明完全一致:
// 先定义函数指针类型 typedef void (*sigfunc_t)(int); // 再用这个类型声明signal函数 sigfunc_t signal(int sig, sigfunc_t func);
知识点补充
这种写法是C语言处理函数指针的标准语法,因为函数调用优先级高于指针解引用,必须用括号把signal(...)括起来,明确表示signal是函数,其返回值是指针,而非*signal是函数。在C89及更早标准中,typedef简化用法还不普及,所以老系统里常见这种嵌套写法。
内容的提问来源于stack exchange,提问作者BenJ
相关产品推荐
相关产品推荐

