小编典典

typedef函数指针?

all

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

typedef void (*FunctionFunc)();

我有几个问题。如果有人能够回答他们,我将不胜感激。

  1. 为什么typedef使用?
  2. 语法看起来很奇怪;之后void不应该有函数名什么的吗?它看起来像一个匿名函数。
  3. 是否创建函数指针来存储函数的内存地址?

所以我现在很困惑;你能为我澄清一下吗?


阅读 245

收藏
2022-03-11

共1个答案

小编典典

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
2022-03-11