typedef int (*PF) (const char *, const char *); 这个声明引入了 PF 类型作为函数指针的同义字,该函数有两个 const char * 类型的参数以及一个 int 类型的返回值。如果要使用下列形式的函数声明,那么上述这个 typedef 是不可或缺的: PF Register(PF pf); Register() 的参数是一个 PF 类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同。做一次深呼吸。下面我展示一下如果不用 typedef,我们是如何实现这个声明的: int (*Register (int (*pf)(const char *, const char *))) (const char *, const char *); 很少有程序员理解它是什么意思,更不用说这种费解的代码所带来的出错风险了。显然,这里使用 typedef 不是一种特权,而是一种必需。持怀疑态度的人可能会问:"OK,有人还会写这样的代码吗?",快速浏览一下揭示 signal()函数的头文件 ,一个有同样接口的函数。 typedef 和存储类关键字(storage class specifier) 这种说法是不是有点令人惊讶,typedef 就像 auto,extern,mutable,static,和 register 一样,是一个存储类关键字。这并不是说 typedef 会真正影响对象的存储特性;它只是说在语句构成上,typedef 声明看起来象 static,extern 等类型的变量声明。下面将带到第二个陷阱: typedef register int FAST_COUNTER; // 错误 编译通不过。问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置,在 typedef 声明中不能用 register(或任何其它存储类关键字)。
1#include<stdio.h>
23 void kk()
4 {
5 printf("hello i am function pointer....!\n");
6 }
7 void gg(void (*k)())
8 {
9 k();
10 }
11 int main()
12 {
13 void (*p)();
14 p=kk;
15 gg(p);
16 return 0;
17 }
本文深入探讨了函数指针的定义与使用,并通过实例解释了如何利用typedef简化复杂的数据类型声明,避免冗长且难以理解的代码。
1357

被折叠的 条评论
为什么被折叠?



