返回函数指针的函数的C语法

kev*_*man 35 c function-pointers

考虑以下typedef:

typedef int (*f1)(float);
typedef f1 (*f2)(double);
typedef f2 (*f3)(int);
Run Code Online (Sandbox Code Playgroud)

f2是一个返回函数指针的函数.与...相同f3,但函数的类型,f3返回的指针是f2.如何在f3没有typedef的情况下定义?我知道typedef是更清晰,更容易理解的定义方式f3.但是,我的目的是更好地理解C语法.

Joh*_*ode 121

从您的声明开始f1:

int (*f1)(float);
Run Code Online (Sandbox Code Playgroud)

您希望f2成为返回函数的指针f1,因此f1在上面的声明中用以下声明替换f2:

int (*      f1     )(float);
            |
      +-----+-----+
      |           |
      v           v
int (*(*f2)(double))(float);
Run Code Online (Sandbox Code Playgroud)

声明如下

        f2                   -- f2
       *f2                   -- is a pointer
      (*f2)(      )          -- to a function
      (*f2)(double)          --   taking a double parameter
     *(*f2)(double)          --   returning a pointer
    (*(*f2)(double))(     )  --   to a function
    (*(*f2)(double))(float)  --     taking a float parameter
int (*(*f2)(double))(float)  --     returning int
Run Code Online (Sandbox Code Playgroud)

您重复以下过程f3:

int (*(*    f2    )(double))(float);
            |
        +---+----+
        |        |
        v        v
int (*(*(*f3)(int))(double))(float);
Run Code Online (Sandbox Code Playgroud)

读作为

          f3                           -- f3
         *f3                           -- is a pointer
        (*f3)(   )                     -- to a function
        (*f3)(int)                     --   taking an int parameter
       *(*f3)(int)                     --   returning a pointer
      (*(*f3)(int))(      )            --   to a function
      (*(*f3)(int))(double)            --     taking a double parameter
     *(*(*f3)(int))(double)            --     returning a pointer
    (*(*(*f3)(int))(double))(     )    --     to a function
    (*(*(*f3)(int))(double))(float)    --       taking a float parameter
int (*(*(*f3)(int))(double))(float);   --       returning int
Run Code Online (Sandbox Code Playgroud)

  • +1,因为这真的回答了原始问题,这是关于C中正确的语法... (9认同)

Pup*_*ppy 14

在C++中,模板的奇迹可以使这更容易.

#include <type_traits>

std::add_pointer<
    std::add_pointer<
        std::add_pointer<
            int(float)
        >::type(double)
    >::type(int)
>::type wow;
Run Code Online (Sandbox Code Playgroud)

  • @Macmade:你标记C++,你得到一个C++答案. (8认同)

Bli*_*ndy 7

与typedef相同,只是将函数定义放在其名称的位置.

这是怎么f2样的:

typedef int (*(*f2)(double))(float);
Run Code Online (Sandbox Code Playgroud)

你可以做f3一个练习,因为我假设这是家庭作业;)

  • downvoter先生需要更好的C解析技巧. (6认同)
  • 它完全一样,用我的`f3` typedef替换我的表单中的`f2`.不确定Google搜索是什么意思,它是基本的C语法.. (2认同)
  • @keveman:他给了你一个非常简单的规则,可以让你构建你想要的任何形式.你为什么抱怨谷歌也给你一部分答案? (2认同)

Dav*_*eas 5

只是不要.它可以做到,但会很混乱.Typedef可以轻松编写和阅读这些简短的代码.

一个函数f,它没有参数,并返回一个函数指针int (*)(float)可能会是这样的(未经测试):

int (*f())(float);
Run Code Online (Sandbox Code Playgroud)

然后,对于其余部分,您只需要继续添加括号,直到它看起来像lisp.


Max*_*kin 5

学习从右到左的规则

“从右到左”规则是破译 C 声明的完全常规规则。它对于创建它们也很有用。