解释void(* signal(int signo,void *(func)(int)))(int)

请解释这个types签名: 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 signo, void *(func)(int)) ,它返回一个指向函数的指针(前缀* )一个int arg(结尾的(int) ),并返回void