无法理解C/Linux中signal函数的声明语法,求解释及相关学习资料
首先先纠正你之前的一个理解错误:signal 函数的返回值不是 void,而是函数指针,和你传入的第二个参数类型完全一致。
你可以先用类型别名简化这个声明,就能一眼看懂:
// 先定义信号处理函数的指针类型:指向参数为int、返回值为void的函数 typedef void (*sighandler_t)(int); // 简化后的signal声明 sighandler_t signal(int sig, sighandler_t func);
接下来逐个解答你的疑问:
- 关于开头
void之后、*之前的括号作用
C语言的声明优先级规则里,括号()优先级高于星号*。如果没有这层外层括号,声明就会变成void *signal(int sig, ...),含义就变成了signal是返回void*指针的普通函数,和实际的定义完全不符。加这层括号是为了强制优先级,明确*是修饰signal的返回值,而非修饰返回值的类型前缀。 - 关于
signal函数名前加星号的原因
加星号是为了说明signal函数的返回值是一个指针,这个指针指向的是信号处理函数,而非普通的数值指针。 - 关于末尾
(int)的含义
这是signal返回的函数指针所指向的函数的参数列表,说明返回的那个信号处理函数,需要接收一个int类型的参数(就是触发处理逻辑的信号编号)。
如果要拆解原生的复杂声明,可以遵循「从内到外、从右到左」的规则:
- 先找到声明里的标识符
signal,向右看是(int sig, void (*func)(int)),说明signal是一个函数,有两个入参 - 再向左看是
*,说明这个函数的返回值是一个指针 - 把前面已经解析的部分盖过,剩下的外层结构是
void (* 已解析部分 )(int),向右看是(int),说明这个返回的指针指向的是一个接收int参数的函数 - 最后看最左边的
void,说明这个指向的函数返回值是void
相关学习资料可以参考《C和指针》的复杂声明章节、《C专家编程》的声明解析相关内容,这类复杂指针、函数指针的用法都有非常详细的讲解。
内容的提问来源于stack exchange,提问作者Manish Dalal
相关产品推荐
相关产品推荐

