可能重复:
what's the meaning of this piece of code? void (*signal(int sig, void (*func)(int)))(int);
我有一个复杂的声明,它取自"signal.h“头文件,下面是声明。
void (*signal(int sig, void (*func)(int)))(int);
现在,我该如何解析它呢?作为
信号是接受两个参数‘sig’和‘func’的函数,‘func’是一个指向以int作为参数并返回void类型的函数的指针;它返回一个指向以int作为参数并返回void类型的函数的指针。
是OK还是signal是指向函数的指针?
发布于 2012-02-29 22:38:50
从最左边的标识符开始,记住[]
和()
在*
之前绑定,所以*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);
...
}
发布于 2012-02-29 22:33:07
使用cdecl.org,您可以获得
声明信号为函数(int,指向返回空的函数(int)的指针)返回指向返回空的函数(int)的指针
对于输入
void (*signal(int, void(*)(int)))(int)
这意味着signal
是一个函数。调用signal
的结果是指向函数void f(int)
的指针。
解释:signal()
调用安装一个新的信号处理程序并返回旧的信号处理程序(这样您可以在以后恢复它)。
发布于 2012-02-29 22:37:44
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)
//参照John的回答进行编辑。
https://stackoverflow.com/questions/9500848
复制相似问题