一个有关C/C++函数指针和typedef的问题

最近在看Linux Kernel的源代码,在里面遇到了一个不太常见的用法,咨询了伟大的stackoverflow,得到了不错的答案,做个小总结。
我写了一个类似的test code如下。

#include<stdio.h>
typedef int Myfunc(int);
typedef int (*point_to_myfunc)(int);
static Myfunc example;
static int example(int a){
	printf("example a=%d\n", a);
	return 1;
}
static void example2(Myfunc* f){
	printf("example2\n");
	f(2);
}
static void example3(int (*)(int));
static void example3(int (*point_to_Myfunc)(int)){
	printf("example3\n");
	point_to_Myfunc(3);
}
int main(){
	point_to_myfunc f=&example;
	example2(f);
	example3(f);
	return 0;
}

分析如下:

typedef int Myfunc(int);

这里定义了一个函数类型叫Myfunc,要使用这个类型的函数必须有一个int参数,并且返回一个int类型。

typedef int (*point_to_myfunc)(int);

这里也是定义了一个类型,不过这是一个函数指针类型,它所指向的地址必须是一个函数,且这个函数必须有一个int参数,并且返回一个int类型。
可以看出其实这个就是Myfunc类型的表述,所以我们有一个替代的方案,效果是一样的,而且逻辑更清晰。

typedef Myfunc *point_to_myfunc;

之后这一段

static Myfunc example;

是一个函数申明,相当于

static int example(int);

 

static int example(int a){
	printf("example a=%d\n", a);
	return 1;
}

这里是example的实现

static void example2(Myfunc* f){
	printf("example2\n");
	f(2);
}

这里是example2的实现,因为写在调用的前面,所以略去了函数申明,它接受一个函数指针作为参数,参数类型是Myfunc*,哈哈,其实就是point_to_myfunc。

static void example3(int (*)(int));

这里是example3的函数申明,当初乍一看这里还挺奇怪,特别是(*),指针符号还打个括号,后来想起来c函数在申明的时候是不用给参数起名的,就像

int f(int);
int f(int a);

这两句是一样的。
回到上面,所以这个

static void example3(int (*)(int));

参数其实就是一个Myfunc类型函数的地址,就是Myfunc*类型,其实和example参数类型一样。

static void example3(int (*point_to_Myfunc)(int)){
	printf("example3\n");
	point_to_Myfunc(3);
}

这句实现证实了上面一点。
下面是main函数

int main(){
	point_to_myfunc f=&example;
	example2(f);
	example3(f);
	return 0;
}

这边第一句f是point_to_myfunc类型的,其实就是Myfunc*类型的,而example是Myfunc类型的,用&example就得到Myfunc*类型啦,很神奇~
之后所有逻辑迎刃而解~天亮了~

Tags : ,

0 thoughts on “一个有关C/C++函数指针和typedef的问题”

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Click the right image To submit your comment: