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

时间:2012-05-25 17:23:19

标签: c function-pointers

考虑以下typedef:

typedef int (*f1)(float);
typedef f1 (*f2)(double);
typedef f2 (*f3)(int);

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

6 个答案:

答案 0 :(得分:118)

f1的声明开始:

int (*f1)(float);

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

int (*      f1     )(float);
            |
      +-----+-----+
      |           |
      v           v
int (*(*f2)(double))(float);

声明读作

        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

您重复f3

的过程
int (*(*    f2    )(double))(float);
            |
        +---+----+
        |        |
        v        v
int (*(*(*f3)(int))(double))(float);

读作

          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

答案 1 :(得分:14)

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

#include <type_traits>

std::add_pointer<
    std::add_pointer<
        std::add_pointer<
            int(float)
        >::type(double)
    >::type(int)
>::type wow;

答案 2 :(得分:7)

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

以下是f2的样子:

typedef int (*(*f2)(double))(float);

你可以f3作为练习,因为我假设这是作业;)

答案 3 :(得分:5)

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

不带参数并返回函数指针f的函数int (*)(float)可能类似于(未经测试):

int (*f())(float);

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

答案 4 :(得分:4)

了解the right-left rule

  

“左右”规则是解密C的完全规则的规则   声明。它也可以用于创建它们。

答案 5 :(得分:0)

使用std::function

typedef std::function<int(float)> f1;
typedef std::function<f1(double)> f2;
typedef std::function<f2(int)>    f3;

typedef std::function<std::function<std::function<int(float)>(double)>(int)> f3;