Typedef函数指针?

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

typedef void (*FunctionFunc)();

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

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


    typedef是将名称与类型关联的语言结构。
    例如,您可以像使用原始类型一样使用它

      typedef int myinteger;
      typedef char *mystring;
      typedef void (*myfunc)();
    

    使用他们喜欢

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

    正如你所看到的,你可以用上面给出的定义来替换typedefed的名字。

    难点在于C和C ++中函数语法和可读性的指针, typedef可以提高这些声明的可读性。 但是,语法是合适的,因为函数 - 与其他更简单的类型不同 - 可能具有返回值和参数,因此有时冗长且复杂的函数指针声明。

    可读性可能开始变得非常棘手,指向函数数组的指针以及其他一些更为间接的风格。

    回答你的三个问题

  • 为什么使用typedef? 为了简化代码的阅读 - 特别是对函数的指针或结构名称。

  • 语法看起来很奇怪(在指向函数声明的指针中)至少在开始时,该语法不易读取。 使用typedef声明可以简化阅读

  • 是否创建了一个函数指针来存储函数的内存地址? 是的,函数指针存储函数的地址。 这与typedef结构无关,只能简化程序的写/读; 编译器只是在编译实际代码之前展开typedef定义。

  • 例:

    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
    

  • typedef用于别名类型; 在这种情况下,你将别名FunctionFunc void(*)()

  • 事实上,语法看起来很奇怪,看看这个:

    typedef   void      (*FunctionFunc)  ( );
    //         ^                ^         ^
    //     return type      type name  arguments
    
  • 不,这只是声明FunctionFunc类型将是一个函数指针,它没有定义一个,就像这样:

    FunctionFunc x;
    void doSomething() { printf("Hello theren"); }
    x = &doSomething;
    
    x(); //prints "Hello there"
    

  • 如果没有typedef字,在C ++中,声明将声明一个类型为指针的变量FunctionFunc作为无参数的函数,返回void

    使用typedef它将FunctionFunc定义为该类型的名称。

    链接地址: http://www.djcxy.com/p/79195.html

    上一篇: Typedef function pointer?

    下一篇: How does free know how much to free?