C中这个奇怪的函数指针声明是什么意思?

use*_*891 14 c function-pointers

任何人都可以解释一下int ((*foo(int)))(int)这是什么吗?

int (*fooptr)(int);
int ((*foo(int)))(int); // Can't understand what this does.

int main()
{
    fooptr = foo(0);
    fooptr(10);
}
Run Code Online (Sandbox Code Playgroud)

.

hac*_*cks 37

int ((*foo(int)))(int);
Run Code Online (Sandbox Code Playgroud)

这声明foo为一个函数,它需要一个int类型参数,并返回一个指向一个需要int类型参数并返回一个函数的函数的指针int.

更清楚:

          foo                           -- foo
        foo(   )                        -- is a function
        foo(int)                         --  taking an int argument
       *foo(int)                          --   returning a pointer
     (*foo(int))(  )                       --   to a function that
    (*foo(int))(int)                        --     takes an int argument
   int (*foo(int))(int)                      --     and returning an int   
Run Code Online (Sandbox Code Playgroud)

是一个很好的解释.

  • 或者从世界的另一个地方窃取符号,它是一个`int - >(int - > int)`函数 (11认同)

AnT*_*AnT 13

foo
Run Code Online (Sandbox Code Playgroud)

是我们宣布的.

foo(int)
Run Code Online (Sandbox Code Playgroud)

这是一个只需要一个int参数的函数

*foo(int)
Run Code Online (Sandbox Code Playgroud)

并返回一个指针

((*foo(int)))(int)
Run Code Online (Sandbox Code Playgroud)

一个接受一个int参数的函数

int ((*foo(int)))(int)
Run Code Online (Sandbox Code Playgroud)

并返回一个int.

一对()是多余的.同样的事情可以表达为

int (*foo(int))(int)
Run Code Online (Sandbox Code Playgroud)


use*_*751 8

已经有了答案,但我想以相反的方式接近它.

函数声明看起来与变量声明相同,只是变量名称被函数名称和参数替换.

所以这声明bar为一个指向函数的指针,该函数接受int并返回int:

int (*bar)(int);
Run Code Online (Sandbox Code Playgroud)

如果代替变量bar,它是foo(int)具有该返回值的函数,则替换barfoo(int)并获取:

int (*foo(int))(int);
//    ^^^^^^^^
// this was "bar" before
Run Code Online (Sandbox Code Playgroud)

添加一对不必要的括号,你会得到:

int ((*foo(int)))(int);
//   ^         ^
//  extra parentheses
Run Code Online (Sandbox Code Playgroud)


imr*_*eal 6

根据cdecl,foo是:

声明foo为function(int)返回指向function(int)返回int的指针

  • 相反,如果你要编写`int((*foo(int)))(int)`你可以对它进行注释或者将它组成更易理解的typedef.如果我在代码审查中看到这一点,我可能会指责程序员炫耀.如果不言而喻,在代码中炫耀是一个坏的,愚蠢的事情. (5认同)
  • 我经常在SO上看到答案中提供了cdecl链接作为解释复杂指针声明的解决方案.我认为这本身就是一个问题,而不是解决方案.AC,C++程序员应该理解这些复杂声明背后的基本逻辑,然后才能使用像cdecl这样的工具. (3认同)