请解释此类签名:void (*signal(int signo, void *(func)(int)))(int)
答案 0 :(得分:17)
当一个typedef用于传递的函数指针时,signal
函数的类型签名更加清晰:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signo, sighandler_t func);
sighandler_t
是一个指向函数的指针,该函数接受int
参数并且不返回任何内容。 signal
函数将这样的函数指针作为其第二个参数。它还返回该类型的函数指针。
答案 1 :(得分:1)
C声明需要从里到外阅读。具有复杂函数声明的棘手部分是弄清楚哪个是最里面的声明符(从哪里开始)。它通常是第一个不是类型标识符的标识符。所以在这种情况下:
void (*signal(int signo, void *(func)(int)))(int)
声明者是signal
。在括号内,后缀的优先级高于前缀,因此signal
是一个带有两个args((int signo, void *(func)(int))
部分)的函数,它返回一个指针(前缀*
)到函数中单个int arg(末尾为(int)
),并返回void