我正在学习如何动态加载 DLL,但我不明白这一行
typedef void (*FunctionFunc)();
我有几个问题。如果有人能够回答他们,我将不胜感激。
- Why is
typedef
used?
- 语法看起来很奇怪;后
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)();
如您所见,您只需更换类型定义的名称及其定义如上所示。
难点在于C和C++中函数指针的语法和可读性,以及typedef
可以提高此类声明的可读性。但是,语法是合适的,因为函数(与其他简单类型不同)可能有返回值和参数,因此有时需要对函数指针进行冗长而复杂的声明。
对于指向函数数组的指针以及其他一些更间接的风格,可读性可能会变得非常棘手。
回答你的三个问题
-
为什么使用 typedef?为了便于阅读代码 - 特别是对于函数指针或结构名称。
-
语法看起来很奇怪(在指向函数声明的指针中)该语法读起来并不明显,至少在开始时是这样。用一个typedef
声明反而简化了阅读
-
是否创建函数指针来存储函数的内存地址?是的,函数指针存储函数的地址。这与typedef
只简化程序的编写/读取的构造;编译器只是在编译实际代码之前扩展 typedef 定义。
Example:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)