我正在学习如何动态加载DLL,但我不明白的是这一行
typedef void(*FunctionFunc)();
我有几个问题。如果有人能回答这些问题,我将不胜感激
- 为什么要使用
typedef - 语法看起来很奇怪;在
void之后是否应该没有函数名或其他内容?它看起来像一个匿名函数 - 是否创建函数指针来存储函数的内存地址
所以我现在很困惑;你能帮我澄清一下吗
typedef是一种将名称与类型关联的语言构造。
例如,您使用它的方式与使用原始类型的方式相同
typedef int myinteger;
typedef char*mystring;
typedef void(*myfunc)();
像这样使用它们
myinteger i;//相当于int i;
mystring s;//与char*s相同;
myfunc f;//同样编译为void(*f)();
如您所见,您可以用上面给出的定义替换typedefed名称。
难点在于C和C++中函数语法和可读性指针,而 TyPulf可以提高这种声明的可读性。然而,这种语法是合适的,因为函数不同于其他更简单的类型,可能有返回值和参数,因此函数指针的声明有时冗长而复杂
对于指向函数数组的指针和其他一些更为间接的风格,可读性可能开始变得非常棘手
回答你的三个问题
-
为什么使用typedef?
为了简化代码的阅读,特别是对于指向函数或结构名称的指针 -
语法看起来很奇怪(在指向函数声明的指针中)
这种语法并不明显,至少在开始时是这样。使用typedef声明可以简化阅读 -
是否创建函数指针来存储函数的内存地址?
是的,函数指针存储函数的地址。这与typedef结构无关,后者只会简化程序的编写/读取;编译器只是在编译实际代码之前扩展typedef定义
例如:
类型定义int(*t_somefunc)(int,int);
整数乘积(整数u,整数v){
返回u*v;
}
t_somefunc afunc=&;产品
...
intx2=(*afunc)(123456);//调用product()计算123*456