Typedef函数指针?

我正在学习如何动态加载DLL的,但我不明白的是这一行

typedef void (*FunctionFunc)(); 

我有几个问题。 如果有人能回答他们,我将不胜感激。

  1. 为什么使用typedef
  2. 语法看起来很奇怪, 在void之后应该没有函数名或者什么的? 它看起来像一个匿名函数。
  3. 是否创建了一个函数指针来存储函数的内存地址?

所以我现在很困惑。 你能为我澄清一下吗?

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 
  1. typedef用于别名类型; 在这种情况下,你正在别名FunctionFunc void(*)()

  2. 事实上,语法看起来很奇怪,看看这个:

     typedef void (*FunctionFunc) ( ); // ^ ^ ^ // return type type name arguments 
  3. 不,这只是声明FunctionFunc类型将是一个函数指针,它没有定义一个,就像这样:

     FunctionFunc x; void doSomething() { printf("Hello there\n"); } x = &doSomething; x(); //prints "Hello there" 

如果没有typedef字,在C ++中,声明将声明一个类型为指针的变量FunctionFunc作为无参数的函数,返回void

使用typedef而是将FunctionFunc定义为该类型的名称。

 #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) ); } 

如果你可以使用C ++ 11,你可能需要使用std::functionusing关键字。

 using FunctionFunc = std::function<void(int arg1, std::string arg2)>;