在探索一些代码时,我在头文件中找到了以下内容:
typedef void (*print_type) (const char*);
这条线是什么意思?我知道typedef
用于表示某个字词,但为什么要使用void
?
答案 0 :(得分:2)
typedef void (*print_type) (const char*);
typedef告诉编译器数据类型print_type
是一个指向函数的指针,该函数接受const char*
作为参数并且不返回值。
...它与DLL无关
我们声明一个函数如下:
ret-type identifier(parameters)
int f(double x)
鉴于对于声明为int a
的东西,指向它的指针被声明为int *a
(在数据类型之后添加*),有人想出一种声明的方法是很自然的函数指针如下:
int *f(double);
这里有一个问题。这实际上是一个函数的声明,它接受double
作为参数并返回int*
。
我们需要明确告诉编译器它不是一个返回指针的函数;相反,它是一个指向函数的指针。我们通过在*f
周围放置括号(括号具有更高的优先级)来完成此操作。
int (*f)(double);
让我们再看一个例子:
int* myfunc(int a[], char b);
要声明一个指向具有上述签名的函数的函数指针数组,我们写:
int* (*ptr[])(int[], char);
有一种称为Spiral Rule的技巧,它对于找出复杂的数据类型非常有用。
使用函数指针可能会变得非常复杂。为了保持代码的可读性和整洁性,我们更喜欢使用typedef为函数指针类型提供单个符号类型名称。
typedef int (*ptrFunc_t)(int, char);
这允许您声明一个指向函数的指针,该函数接受int
和char
作为参数,并返回int
,如下所示:
ptrFunc_t myptr;
答案 1 :(得分:2)
此:
void foo(const char*);
将foo
声明为接受const char*
参数并返回void
的函数(即,它不返回任何内容)。 (它必须在某处定义,以便您能够调用它。)
此:
void (*bar)(const char*);
将bar
定义为指针对象。它是指向与上面的foo
类型相同的函数的指针。
添加typedef
关键字,即:
typedef void (*print_type)(const char*);
定义print_type
,不是作为指针到函数类型的对象,而是作为指针到函数类型的别名。
答案 2 :(得分:0)
它正在创建一个指向函数的指针的typedef,该函数接受一个const char指针参数并且什么都不返回。
这样的typedef在用于动态加载的库中很常见(即使用LoadLibrary等),因为你必须加载到实际函数的函数指针,而不是像加载时一样直接使用函数名。联。