对signal函数声明的困惑:如何解读void (*signal(int, void(*)(int)))(int)
解读C语言中的
signal函数声明 先直接拆解这个看似复杂的声明:void (*signal(int sig, void (*func)(int))) (int);
按照C语言声明的右左法则一步步解析:
- 找到最内层的标识符
signal,它后面跟着(...),所以signal是一个函数。 - 看
signal的参数:第一个是int sig(整型的信号编号参数),第二个是void (*func)(int)(指向“接受int参数、返回void的函数”的指针,也就是信号处理函数的指针)。 - 再看
signal的返回值部分:void (*...) (int),这表示返回的是一个指向“接受int参数、返回void的函数”的指针(通常是之前注册的信号处理函数指针)。
你的初步推测完全正确!这个声明的直白意思就是:
signal是一个函数,它接收两个参数:一个int类型的信号编号,一个信号处理函数的指针;执行后会返回另一个同类型的信号处理函数指针。
这种写法看起来复杂,是因为C语言没有直接定义“返回函数指针的函数”的语法,只能通过嵌套指针语法实现。如果用typedef简化,会清晰很多:
// 先定义一个函数指针类型,指向接受int、返回void的函数 typedef void (*SignalHandler)(int); // 简化后的signal声明 SignalHandler signal(int sig, SignalHandler func);
内容的提问来源于stack exchange,提问作者user129393192
相关产品推荐
相关产品推荐

