关于c ++:Typedef函数指针?

Typedef function pointer?

我正在学习如何动态加载DLL,但我不理解这一行

1
typedef void (*FunctionFunc)();

我有几个问题。如果有人能回答,我会感激的。

  • 为什么使用typedef
  • 语法看起来很奇怪;在void之后应该没有函数名或其他什么?它看起来像一个匿名函数。
  • 是否创建函数指针来存储函数的内存地址?
  • 所以我现在很困惑,你能为我澄清一下吗?


    是一种语言构造,将一个名字与一个类型相关联。你也用同样的方式使用原始类型

    1
    2
    3
      typedef int myinteger;
      typedef char *mystring;
      typedef void (*myfunc)();

    使用它们

    1
    2
    3
      myinteger i;   // is equivalent to    int i;
      mystring s;    // is the same as      char *s;
      myfunc f;      // compile equally as  void (*f)();

    只要你能看到,你就可以用上面给出的定义来替换典型的名称。

    指针对C+和C+中的语法功能和可行性的难度与EDOCX1&0)可以改善这些宣言的可行性。然而,句法是恰当的,因为函数不同于其他单纯类型,所以可能有一个返回值和参数,因此有时长度和函数指针的复合声明。

    实用性可以开始以指针对函数阵列进行实用的运算,还有一些甚至更间接的气味。

    回答你的三个问题

    • 为什么是典型的?方便读取代码,特别是指针到功能或结构名称的代码。

    • 句法看上去像ODD(在指针对功能声明中)这个句法不一定要读,至少在开始的时候。不易阅读的宣言

    • 一个函数指针创建用于存储函数的存储器地址吗?是的,一个函数指针百叶窗的函数地址。在编译实际代码之前,编译器只扩展了类型定义。

    Example:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef int (*t_somefunc)(int,int);

    int product(int u, int v) {
      return u*v;
    }

    t_somefunc afunc = &product;
    ...
    int x2 = (*afunc)(123, 456); // call product() to calculate 123*456


  • 在这种情况下,你被列为FunctionFuncvoid(*)()

  • Indeed the syntax does look odd,have a look at this:

    1
    2
    3
    typedef   void      (*FunctionFunc)  ( );
    //         ^                ^         ^
    //     return type      type name  arguments
  • 不,这个简单地告诉编译员,FunctionFunc型将是一个函数指针,它不是一个定义,就像这样:

    ZZU1


  • 《宣言》将在C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+C+D+1+D+1+D+D+C+D+C+D+1+

    typedef的名称命名。


    如果你可以使用C+11,你可能想使用std::functionusing关键词。

    1
    using FunctionFunc = std::function<void(int arg1, std::string arg2)>;


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include <stdio.h>
    #include <math.h>

    /*
    To define a new type name with typedef, follow these steps:
    1. Write the statement as if a variable of the desired type were being declared.
    2. Where the name of the declared variable would normally appear, substitute the new type name.
    3. In front of everything, place the keyword typedef.
    */


    // typedef a primitive data type
    typedef double distance;

    // typedef struct
    typedef struct{
        int x;
        int y;
    } point;

    //typedef an array
    typedef point points[100];

    points ps = {0}; // ps is an array of 100 point

    // typedef a function
    typedef distance (*distanceFun_p)(point,point) ; // TYPE_DEF distanceFun_p TO BE int (*distanceFun_p)(point,point)

    // prototype a function    
    distance findDistance(point, point);

    int main(int argc, char const *argv[])
    {
        // delcare a function pointer
        distanceFun_p func_p;

        // initialize the function pointer with a function address
        func_p = findDistance;

        // initialize two point variables
        point p1 = {0,0} , p2 = {1,1};

        // call the function through the pointer
        distance d = func_p(p1,p2);

        printf("the distance is %f
    "
    , d );

        return 0;
    }

    distance findDistance(point p1, point p2)
    {
    distance xdiff =  p1.x - p2.x;
    distance ydiff =  p1.y - p2.y;

    return sqrt( (xdiff * xdiff) + (ydiff * ydiff) );
    }