帮助我理解以下原型。最后(int)
做了什么?
void ( *signal(int sig, void (*handler)(int)) ) (int);
答案 0 :(得分:8)
整个事情声明了一个名为signal
的函数:
signal
接受一个int和一个函数指针
int
并返回void
signal
返回一个函数指针
int
并返回void
这就是最后int
进来的地方。
您可以使用the spiral rule来理解此类声明或程序cdecl(1)
。
答案 1 :(得分:5)
找到最左边的标识符并逐步解决,记住在[]
之前()
和*
绑定; IOW,*a[]
是指针数组,(*a)[]
是指向数组的指针,*f()
是返回指针的函数,(*f)()
是指向函数的指针。因此,
void ( *signal(int sig, void (*handler)(int)) ) (int);
分解为
signal -- signal
signal( ) -- is a function
signal( sig ) -- with a parameter named sig
signal(int sig, ) -- of type int
signal(int sig, handler ) -- and a parameter named handler
signal(int sig, *handler ) -- which is a pointer
signal(int sig, (*handler)( )) ) -- to a function
signal(int sig, (*handler)(int)) ) -- taking an int parameter
signal(int sig, void (*handler)(int)) ) -- and returning void
*signal(int sig, void (*handler)(int)) ) -- returning a pointer
( *signal(int sig, void (*handler)(int)) )( ) -- to a function
( *signal(int sig, void (*handler)(int)) )(int) -- taking an int parameter
void ( *signal(int sig, void (*handler)(int)) )(int); -- and returning void
signal
函数将信号(sig
)与回调函数(handler
)相关联,如下所示:
#include <signal.h>
static int interrupt = 0;
/**
* The following function will be called when a SIGINT is
* detected (such as when someone types Ctrl-C)
*/
void interrupt_handler( int sig )
{
interrupt = 1;
}
int main( void )
{
/**
* Declare a pointer to the old interrupt handler function
*/
void (*old_interrupt_handler )(int);
/**
* Save the old interrupt handler while setting the new one
*/
old_interrupt_handler = signal( SIGINT, interrupt_handler );
while ( !interrupt )
{
// do stuff until someone hits Ctrl-C
};
/**
* restore the original interrupt handler
*/
signal( SIGINT, old_interrupt_handler );
return 0;
}
答案 2 :(得分:2)
正如我在回答另一个最近的问题时所指出的,理解这些声明的一种方法是将参数列表和数组声明符与左边的东西交换,然后向后读取声明。在这种情况下,给你
void ( *signal(int sig, void (*handler)(int)) ) (int)
- &GT;
void (int)( *(int sig, void (int)(*handler))signal )
其中读取为“`signal是一个函数,它接受两个参数并返回一个指向函数的指针,该函数接受一个int参数并返回void”。这两个参数是int(sig)和一个函数的指针(处理程序),该函数接受一个int参数并返回void。
或者你可以在心理上进行交换,这与螺旋规则相同。
答案 3 :(得分:0)
void (*handler)(int);
handler是指向函数(比如Fn1)的指针,返回类型为void
并且需要int
void (*signal(int sig, Fn1)) (int);
(*signal(int sig, Fn1);
此函数的返回类型为void
,并以int
和function pointer
作为参数。
此函数的返回类型(其指针为signal
)可能是一个函数的函数指针,该函数采用返回类型为int
的{{1}} [final int
]
答案 4 :(得分:0)
上述原型可以写成::
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t handler);
现在,我希望你能清楚。
答案 5 :(得分:0)
它是一个函数,返回一个指向函数的指针返回void..Source:“解密C声明”在DEEP C SECRETS中