帮助我理解以下原型。最后(int)
在做什么?
void ( *signal(int sig, void (*handler)(int)) ) (int);
帮助我理解以下原型。最后(int)
在做什么?
void ( *signal(int sig, void (*handler)(int)) ) (int);
找到最左边的标识符并找出路,记住它[]
并()
在之前绑定*
;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;
}
整个事情声明了一个名为的函数signal
:
signal
接受一个 int 和一个函数指针
int
并返回void
signal
返回一个函数指针
int
并返回一个void
这就是最后一个int
进来的地方。
您可以使用螺旋规则来理解此类声明或程序cdecl(1)
。
正如我在对另一个最近的问题的回答中指出的那样,理解这些声明的一种方法是将参数列表和数组声明符与其左边的东西交换,然后向后阅读声明。在这种情况下,给你
void ( *signal(int sig, void (*handler)(int)) ) (int)
->
void (int)( *(int sig, void (int)(*handler))signal )
读作“`signal 是一个函数,它接受两个参数并返回一个指向函数的指针,该函数接受一个 int 参数并返回 void”。这两个参数是一个 int (sig) 和一个指向接受 int 参数并返回 void 的函数的指针(处理程序)。
或者你可以在心理上进行交换,这与螺旋规则相同。
它是一个返回指向返回 void 的函数的指针的函数。来源:DEEP C SECRETS 中的“Unscrambling C Declarations”
void (*handler)(int);
handler 是指向具有返回类型的函数(例如 Fn1)的指针,void
并接受int
void (*signal(int sig, Fn1)) (int);
(*signal(int sig, Fn1);
此函数具有返回类型void
,并以int
andfunction pointer
作为参数。
这个函数的返回类型,它的指针signal
可能是一个函数指针,它接受一个返回类型为int
[final int
]的函数void
上面的原型可以写成:
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t handler);
现在,我希望你会清楚。