我在APUE书中关于信号的一章中找到了这个声明:
void (*signal(int signo, void (*func)(int)))(int);
我不完全理解语法。(*func(的声明在语法上是我对函数参数/指针的期望。我不明白";信号";声明,并且尾部(int(。我想知道是否有人能澄清这一点-感谢
函数signal
返回指向void (int)
类型函数的指针,并有两个参数:int
和指向void (int)
类型函数的指示器。
所以像这样的东西应该工作
void foo(int);
void (*signal(int signo, void (*func)(int)))(int)
{
return func;
}
int main(int argc, char *argv[])
{
signal(42, foo);
return 0;
}
使用螺旋规则(顺时针从内向外读取(来理解语法:
-
查找标识符
void (*signal(int signo, void (*func)(int)))(int); ^ ^ | | +----+ | Identifier name
signal
是。。。。
-
向右移动
void (*signal(int signo, void (*func)(int)))(int); ^ ^ | | +----------------------------+ | arguments (so, its a function)
signal
是一个接受int
和void (*) (int)
的函数[指向接受int
参数但不返回任何内容(void
(的函数的指针]作为参数。。。。
-
由于右括号的原因,无法再向右移动,请向左移动。
void (*signal(int signo, void (*func)(int)))(int); ^ | pointer
signal
是一个接受int
和void (*) (int)
作为参数并返回指针的函数。。。。
-
由于左括号的原因,无法再向左移动,请继续向右移动。
void (*signal(int signo, void (*func)(int)))(int); ^ ^ | | +---+ | argument (which means signal() is returning a function pointer)
signal
是一个接受int
和void (*) (int)
作为自变量的函数,并返回指向接受int
自变量和…的函数的指针。。。。
-
由于符号用完,无法再向右移动,请向左移动。
void (*signal(int signo, void (*func)(int)))(int); ^ ^ | | +--+ | return type of function whose pointer returned by signal() function
signal
是一个接受int
和void (*) (int)
作为参数的函数,并返回指向接受int
参数但不返回任何值的函数的指针(void
(。