我正在学习如何动态加载 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