首页 理论教育 C语言程序设计:typedef类型定义符

C语言程序设计:typedef类型定义符

时间:2023-10-29 理论教育 版权反馈
【摘要】:类型定义符typedef即可实现此功能。例如:typedef char NAME[20];现NAME是字符数组类型,数组长度为20,可用NAME声明变量。typedef只是对已经存在的类型增加一个类型名,并不能创造新的类型。typedef与#define有相似之处,但两者在本质上是不同的。使用typedef可以定义与机器无关的类型,以增加程序的通用性和可移植性。

C语言程序设计:typedef类型定义符

除了提供的标准数据类型和用户自己声明的结构体、共用体、枚举类型外,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;

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈