10.3.3 用typedef定义类型
以往,代码中用的类型名都是C语言提供的标准类型名,如int、char、float、double等,当然,结构体、共用体、枚举类型等可以自己命名。
此外,还可以用typedef关键字来定义新的类型名以代替已有的类型名。注意,typedef是用来定义新类型名的,不是用来定义变量的。看看如下代码:

这相当于用INTEGER代表了int,那么定义整型变量就可以这样定义:

也可以用typedef定义一个结构体类型:

上面这段代码定义了一个新的类型名DATE(不是定义结构体变量,因为前面有typedef关键字),代表上面定义的这个结构体类型。现在,可以用DATA来定义变量了。看看如下代码:

针对typedef的用法,还有一些变形,这些变形可以适当记一记,以后也许会遇到:

至此,可以总结一下typedef这样的语句是怎样写成的。这里以定义一个整型数组为例。
(1)写出常规的整型数组定义方法:

(2)将变量名n替换成自己想用的类型名:

(3)在前面加上typedef:

(4)这三步完成后就可以用这个类型名来定义变量。如下:

这里有一些重要说明,请注意:
(1)习惯上把用typedef定义的类型名用大写字母表示,以便区别于C语言提供的标准类型标识符,如int、char等。
(2)typedef是用来定义各种类型名的,不是用来定义变量的,这一点一定不能搞错。
(3)typedef只是对已经存在的类型增加一个类型名(相当于给类型起一个别名),并没有创造新类型。
(4)typedef是编译时处理的。
回忆一下前面讲解的内容:一个项目可以由一个或者多个源程序文件组成,一个项目可以通过编译、链接最终形成一个可执行文件。而编译这个步骤可以拆开来看,它实际也是做了好几件事情,包括:
· 预处理:#define、#include、#ifdef;
· 编译:词法和语法分析、目标代码生成、优化、typedef;
· 汇编:产生.o(.obj)目标文件。
(5)typedef最主要的作用是什么?其最主要的作用是有利于程序的通用性与可移植性(当然还能简化书写,把一个很长的类型名简化成一个短类型名但这个不算最主要的作用)。
例如以往这样定义int型变量:

将来如果想将所有int型变量都变成long型变量,就得找到所有int型变量定义的位置并逐个修改。
但如果这样写代码定义,首先用一个typedef,如下所示:

然后在定义整型变量时不使用int来定义,而是使用INTEGER来定义。例如:

那以后若需要把int修改为long,只需要修改typedef这一行。例如:

这样所有的int类型变量就都被修改为long类型。