请解释这个类型签名:
void (*signal(int signo, void *(*func)(int)))(int)
void (*signal(int signo, void *(*func)(int)))(int)
当为传递的函数指针使用typedef时,signal
函数的类型签名会更加清晰明了:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signo, sighandler_t func);
sighandler_t
是一个指向函数的指针,该函数接受一个int
参数并返回无值。 signal
函数需要这样一个函数指针作为它的第二个参数,并返回该类型的函数指针。
C语言声明需要从内向外阅读。对于复杂的函数声明,最棘手的部分是找出最内层的声明符(从哪里开始)。通常情况下,第一个不是类型标识符的标识符就是最内层的声明符。所以在这种情况下:
void (*signal(int signo, void *(func)(int)))(int)
signal
。在括号内,后缀比前缀优先级高,因此 signal
是一个函数,它有两个参数((int signo, void *(func)(int))
部分),返回一个指向函数的指针(前缀 *
),该函数接受一个 int 参数(结尾处的 (int)
),并返回 void
。