我如何在C中阅读这个复杂的声明?

可能重复:
这段代码的含义是什么? void(* signal(int sig,void(* func)(int)))(int);

我有一个复杂的声明,它取自“signal.h”头文件,下面是声明。

void (*signal(int sig, void (*func)(int)))(int); 

现在,我该如何解析它? 如

signal是函数接受两个参数’sig’的int类型和’func’,它是一个指向函数的指针,它将int作为参数并返回void类型; 它返回一个指向函数的指针,该函数将int作为参数并返回void。

它是OK还是signal是一个指向函数的指针?

从最左边的标识符开始,然后解决问题,记住*之前的[]()绑定,所以*a[]是一个指针数组, (*a)[]是一个指向数组的指针, *f()是一个返回指针的函数, (*f)()是一个指向函数的指针:

  signal -- signal signal( ) -- is a function signal( sig, ) -- with a parameter named sig signal(int sig, ) -- of type int signal(int sig, func ) -- and a parameter named func signal(int sig, (*func) ) -- which is a pointer signal(int sig, (*func)( )) -- to a function signal(int sig, (*func)(int)) -- taking an int parameter signal(int sig, void (*func)(int)) -- and returning void *signal(int sig, void (*func)(int)) -- returning a pointer (*signal(int sig, void (*func)(int)))( ) -- to a function (*signal(int sig, void (*func)(int)))(int) -- taking an int parameter void (*signal(int sig, void (*func)(int)))(int); -- and returning void 

signal将信号处理函数func与信号sig相关联,并将指针返回到旧信号处理函数:

 void new_interrupt_handler(int sig) { ... // do something interesting with interrupt signal } int main(void) { void (*old_interrupt_handler)(int); ... /** * Set up our new interrupt handler */ old_interrupt_handler = signal(SIGINT, new_interrupt_handler); ... /** * Restore original interrupt handler */ signal(SIGINT, old_interrupt_handler); ... } 

使用cdecl.org ,你得到

声明信号为函数(int,指向函数的函数(int)返回void)返回指向函数(int)返回void的指针

输入

 void (*signal(int, void(*)(int)))(int) 

这意味着signal是一种function。 调用signal的结果是指向函数void f(int)指针。

说明: signal()调用安装一个新的信号处理程序并返回旧的信号处理程序(如果你愿意,可以稍后恢复它)。

signal是一个函数,它接受两个参数并返回一个指向函数的指针,该函数将int作为参数并返回void

signal采用的两个参数是一个int和一个指向函数的指针,该函数将int作为参数并返回void

是的,你得到了描述和整体想法。

不,那是对的。 signal接受2个参数,一个int和一个指向函数的指针,并返回一个指向函数的指针(与func参数具有相同的签名。)

它类似于(imo)更具可读性:

 typedef void (*sig_func)(int); sig_func signal(int sig, sig_func func); 
 void (*signal(int, void (*)(int)))(int); signal( ) // signal is a function int, void (*)(int) // the parameter types of the function: // an int and a function pointer (take int, return void) void (* )(int); // the return type of the function: // a function pointer (take int, return void) 

//编辑引用约翰的答案。