请解释这个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