除了提供的标准数据类型和用户自己声明的结构体、共用体、枚举类型外,C语言中还允许用户自己定义类型名来替代已有类型名。类型定义符typedef即可实现此功能。
例如:
typedef int INTEGER;
typedef char CHARSET;
定义后就可用INTEGER来代替int作整型变量的类型说明,用CHARSET代替char作字符型变量的类型说明。
例如:
INTEGER a,b;CHARSET A,B;
它等效于:
int a,b;char A,B;
用typedef定义数组、指针、结构体等复杂类型会带来极大方便,不仅使程序书写简单,而且意义更为明确,增强可读性。
例如:
typedef char NAME[20];
现NAME是字符数组类型,数组长度为20,可用NAME声明变量。
例如:
NAME n1,n2;
等效于:
char n1[20],n2[20];
又如:
typedef struct Student
{
char name[20];
int num;
char sex;
}STU;
定义STU表示struct Student的结构体类型,然后可用STU来声明结构体变量:
STU student1,student2;
typedef定义的一般形式为:
typedef 原类型名 新类型名;
归纳起来,声明一个新的类型名的步骤是:
(1)先按定义变量的方法写出定义体(如int i;)。(www.xing528.com)
(2)将变量名换成新类型名(如将i换成COUNT)。
(3)在最前面加typedef(如typedef int COUNT;)。
(4)用新类型名去定义变量(如COUNT i;)。
再以定义上述的数组类型为例说明:
(1)char n[100];
(2)char NAME[100];
(3)typedef char NAME[100];
(4)NAME n;
同样,对指针类型,其实现步骤是:
(1)char*p;
(2)char*STRING;
(3)typedef char*STRING;
(4)STRING p;
需要注意:
(1)用关键字typedef可以声明各种类型名,但不能用来定义变量。
(2)typedef只是对已经存在的类型增加一个类型名,并不能创造新的类型。
(3)typedef与#define有相似之处,但两者在本质上是不同的。例如:“typedef int COUNT;”和“#define COUNT int”的作用都是用COUNT代表int。不同点在于:#define是在预编译时处理的,它只能作简单的字符串替换;而typedef是在编译时处理的,实际上它并不是作简单的字符串替换,而是声明一个新的类型。
下面的例子就很好的说明了这一区别:
#define pstr1 char*
typedef char*pstr2;
pstr1 s1,s2;
pstr2 s3,s4;
在上述的变量定义中,s1、s3、s4都被定义为char*,而s2则定义成了char,并不是所预期的指针变量。
(4)typedef的另一个用途是:当不同源文件中用到同一类型数据(尤其是像数组、指针、结构体、共用体等类型)时,常用typedef声明一些数据类型,把它们单独放在一个文件中,然后在需要用到它们的文件中用#include命令把它们包含进来。
(5)使用typedef可以定义与机器无关的类型,以增加程序的通用性和可移植性。例如,有的计算机系统的int型数据占2个字节,有的则占4个字节。如果把一个C程序从一个以4个字节存放整型的计算机系统移植到以2个字节存放的系统,按一般方法需要将定义变量中的每个int改为long。如果有多处int定义变量,显然需改动多次。
现在可以用一个INTEGER来代替int:
typedef int INTEGER;
在移植时只需改动typedef定义体即可:
typedef long INTEGER;
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。