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

时间:2010-02-16 04:48:41

标签: c linux function signals

请解释此类签名:void (*signal(int signo, void *(func)(int)))(int)

2 个答案:

答案 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