嵌套的函数指针声明



我在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;
}

使用螺旋规则(顺时针从内向外读取(来理解语法:

  1. 查找标识符

    void (*signal(int signo, void (*func)(int)))(int);
    ^    ^
    |    |
    +----+
    |
    Identifier name
    

signal是。。。。

  1. 向右移动

    void (*signal(int signo, void (*func)(int)))(int);
    ^                            ^
    |                            |
    +----------------------------+
    |
    arguments (so, its a function)
    

signal是一个接受intvoid (*) (int)的函数[指向接受int参数但不返回任何内容(void(的函数的指针]作为参数。。。。

  1. 由于右括号的原因,无法再向右移动,请向左移动。

    void (*signal(int signo, void (*func)(int)))(int);
    ^
    |
    pointer
    

signal是一个接受intvoid (*) (int)作为参数并返回指针的函数。。。。

  1. 由于左括号的原因,无法再向左移动,请继续向右移动。

    void (*signal(int signo, void (*func)(int)))(int);
    ^   ^
    |   |
    +---+
    |
    argument 
    (which means signal() is returning a function pointer)
    

signal是一个接受intvoid (*) (int)作为自变量的函数,并返回指向接受int自变量和…的函数的指针。。。。

  1. 由于符号用完,无法再向右移动,请向左移动。

    void (*signal(int signo, void (*func)(int)))(int);
    ^  ^
    |  |
    +--+
    |
    return type of function whose pointer returned by signal() function
    

signal是一个接受intvoid (*) (int)作为参数的函数,并返回指向接受int参数但不返回任何值的函数的指针(void(。

最新更新