Typedef函数指针?
我正在学习如何动态加载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
typedef
用于别名类型; 在这种情况下,你将别名FunctionFunc
void(*)()
。
事实上,语法看起来很奇怪,看看这个:
typedef void (*FunctionFunc) ( );
// ^ ^ ^
// return type type name arguments
不,这只是声明FunctionFunc
类型将是一个函数指针,它没有定义一个,就像这样:
FunctionFunc x;
void doSomething() { printf("Hello theren"); }
x = &doSomething;
x(); //prints "Hello there"
如果没有typedef
字,在C ++中,声明将声明一个类型为指针的变量FunctionFunc
作为无参数的函数,返回void
。
使用typedef
它将FunctionFunc
定义为该类型的名称。