关于typedef的使用,我们的教科书,真神奇,竞然只给出了一个很模棱两可的定义与几个简单使用的例子,先不感叹作者的负责与不负责,至少这样的教科书会对我们造成很多的困扰,最近在使用typedef时,想仔细看个究竟,国内的网络真是太强大了,千篇一律的转载,没一个能看懂的,难道我的理解力有问题?基础的用法都说得清楚,因为教材上也是这样说的,至于更深层次的,似乎都是遮遮掩掩,没几个说清楚的,包括某著名搜索引擎,其实找来找去原来都是从那转载过去的,可见国内网络上的有些东西是很不负责任的,作者纯粹为发博客而博客。因此,很多初学者对其的理解仅仅局限于:typedef主要用来定义一个已有类型的“别名(alias)”。正因如此,才有了对typedef int myint和typedef myint int之间的犹豫不决。
教材上的那千篇一律的介绍,本文就不再谈论了,下面主要就教材上没有说得太清楚的地方介绍一下:
首先结合C99标准中关于typedef的说明:
In a declaration whose storage-class specifier is typedef , each declarator defines an indentifier to be a typedef name that denotes the type specified for the identifier in the way described in xx
在一个声明中,如果有存储类型说明符typedef,标识符被定义为一个typedef name,这个typedef name表示一个声明中标识符(identifier)的类型。
于是对比:
1 int * pointer; 2 3 typedef int * pointer;
int * pointer中,pointer是一个变量,它的类型就是:int指针型,而在前面加typedef后,pointer立即变为一个typedef-name,其所表示的类型就是int指针型(int *)。 于是pointer就由一int指针型变量变成了,pointer类型了(typedef-name)。
于是,很多教材上没有用法就出现了:
1.数组类型的定义
例如: typedef int array[2];
描述: int array[2],声明一个含两个元素的int数组,由于array是指针,
所以这里typedef的是将int指针型,定义为array,只不过这里的指针型具有数组的属性而已。
因此,array等价于 int [2]定义;
array a声明等价于int a[2]声明。
扩展: typedef int array[M][N];
描述: array等价于 int [M][N]定义;同上
array a声明等价于int a[M][N]声明
2.指针类型定义
例如: typedef int *pointer;
描述: pointer等价于 int *定义;
pointer p声明等价于int *a声明
例如: typedef int *pointer[M];
描述: pointer等价于 int *[M]定义;
pointer p声明等价于int *a[M]声明明
3.函数声明
例如: typedef int func(void);
func等价于 int (void)类型函数,func实际上是指向函数首地址的指针,所以这里typedef的还是int指针型
描述1: func f声明等价于 int f(void)声明,用于文件的函数声明
描述2: func *pf声明等价于 int (*pf)(void)声明,用于函数指针的生命,见下一条
4.函数指针
例如: typedef int (*func)(void)
描述: 这里还是typedef的一个指针型,不过该指针型不再是int指针型,而是一个函数指针型,因此这里相当于将func typedef为一函数指针型
func等价于int (*)(void)类型
func pf等价于int (*pf)(void)声明,pf是一个函数指针变量