我正在学习如何动态加载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
其他回答
如果你能使用c++ 11,你可能想要使用std::function和using关键字。
using FunctionFunc = std::function<void(int arg1, std::string arg2)>;
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"
对于语法的一般情况,您可以查看ANSI C标准的附录A。
在那里的Backus-Naur表单中,您可以看到typedef具有类型存储类说明符。
在类型声明-说明符中,您可以看到可以混合使用许多说明符类型,它们的顺序无关紧要。
例如,正确的说法是,
long typedef long a;
将类型a定义为long long的别名。因此,要了解详细使用的类型定义,您需要参考一些定义语法的backus-naur形式(有许多正确的ANSI C语法,而不仅仅是ISO语法)。
当您使用typedef定义函数类型的别名时,您需要将别名放在与函数标识符相同的位置。在你的例子中,你将FunctionFunc类型定义为一个函数指针的别名,该函数的类型检查在调用时被禁用,并且不返回任何内容。
如果没有typedef这个词,在c++中,声明将声明一个类型为指针的变量FunctionFunc,指向无参数的函数,返回void。
使用typedef,它将FunctionFunc定义为该类型的名称。