我正在学习如何动态加载DLL,但我不明白的是这一行
typedef void (*FunctionFunc)();
我有几个问题。如果有人能回答这些问题,我会很感激。
为什么使用typedef ? 语法看起来很奇怪;void后面不应该有函数名之类的吗?它看起来像一个匿名函数。 函数指针是用来存储函数的内存地址的吗?
所以我现在很困惑;你能给我解释一下吗?
我正在学习如何动态加载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)();
正如您所看到的,您可以用上面给出的定义来替换经过类型定义的名称。
难点在于C和c++中指向函数的指针语法和可读性,而typedef可以提高这类声明的可读性。但是,语法是合适的,因为函数与其他更简单的类型不同,它可能有一个返回值和参数,因此有时对函数指针的声明冗长而复杂。
对于指向函数数组的指针和其他一些更间接的类型,可读性可能会变得非常棘手。
来回答你的三个问题
Why is typedef used? To ease the reading of the code - especially for pointers to functions, or structure names. The syntax looks odd (in the pointer to function declaration) That syntax is not obvious to read, at least when beginning. Using a typedef declaration instead eases the reading Is a function pointer created to store the memory address of a function? Yes, a function pointer stores the address of a function. This has nothing to do with the typedef construct which only ease the writing/reading of a program ; the compiler just expands the typedef definition before compiling the actual code.
例子:
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 is used to alias types; in this case you're aliasing FunctionFunc to void(*)(). Indeed the syntax does look odd, have a look at this: typedef void (*FunctionFunc) ( ); // ^ ^ ^ // return type type name arguments No, this simply tells the compiler that the FunctionFunc type will be a function pointer, it doesn't define one, like this: FunctionFunc x; void doSomething() { printf("Hello there\n"); } x = &doSomething; x(); //prints "Hello there"
如果没有typedef这个词,在c++中,声明将声明一个类型为指针的变量FunctionFunc,指向无参数的函数,返回void。
使用typedef,它将FunctionFunc定义为该类型的名称。
对于语法的一般情况,您可以查看ANSI C标准的附录A。
在那里的Backus-Naur表单中,您可以看到typedef具有类型存储类说明符。
在类型声明-说明符中,您可以看到可以混合使用许多说明符类型,它们的顺序无关紧要。
例如,正确的说法是,
long typedef long a;
将类型a定义为long long的别名。因此,要了解详细使用的类型定义,您需要参考一些定义语法的backus-naur形式(有许多正确的ANSI C语法,而不仅仅是ISO语法)。
当您使用typedef定义函数类型的别名时,您需要将别名放在与函数标识符相同的位置。在你的例子中,你将FunctionFunc类型定义为一个函数指针的别名,该函数的类型检查在调用时被禁用,并且不返回任何内容。
如果你能使用c++ 11,你可能想要使用std::function和using关键字。
using FunctionFunc = std::function<void(int arg1, std::string arg2)>;
#include <stdio.h>
#include <math.h>
/*
To define a new type name with typedef, follow these steps:
1. Write the statement as if a variable of the desired type were being declared.
2. Where the name of the declared variable would normally appear, substitute the new type name.
3. In front of everything, place the keyword typedef.
*/
// typedef a primitive data type
typedef double distance;
// typedef struct
typedef struct{
int x;
int y;
} point;
//typedef an array
typedef point points[100];
points ps = {0}; // ps is an array of 100 point
// typedef a function
typedef distance (*distanceFun_p)(point,point) ; // TYPE_DEF distanceFun_p TO BE int (*distanceFun_p)(point,point)
// prototype a function
distance findDistance(point, point);
int main(int argc, char const *argv[])
{
// delcare a function pointer
distanceFun_p func_p;
// initialize the function pointer with a function address
func_p = findDistance;
// initialize two point variables
point p1 = {0,0} , p2 = {1,1};
// call the function through the pointer
distance d = func_p(p1,p2);
printf("the distance is %f\n", d );
return 0;
}
distance findDistance(point p1, point p2)
{
distance xdiff = p1.x - p2.x;
distance ydiff = p1.y - p2.y;
return sqrt( (xdiff * xdiff) + (ydiff * ydiff) );
}