C语言关键字浅析-typedef

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Johan_Joe_King/article/details/84279824

### C语言关键字浅析系列 ###

### ISO/ANSI C 关键字 ###

typedef从字面上看应该分为type和define两个部分,意思是“定义了类型”

这是C语言为用户提供的又一种自定义数据类型的途径,不过与结构的概念不同,typedef只是在类型名称上做手脚

看上去说的是定义类型,其实这里说的自定义是自己给一种数据类型取名

typedef的作用是:

作为一种有高级数据特性的工具,为某一类型创建自定义的名称。

1、typedef的意义

首先我们可以了解一下typedef关键字设计之初被希望解决什么问题,或者说带来某方面的一点便利

如果你对C语言中的#define有所了解,对比二者你可以大概看出他们的作用中的区别:

#define MAX_VALUE = 100;     /* 程序中所有有MAX_VALUE的地方都会被预处理器替换为100 */
typedef unsigned char BYTE;  /* 程序中所有BYTE都会被编译器解释为unsigned int类型 */

其区别就在于:#define可以针对值、函数格式、类型等,但typedef只针对类型;#define是预处理指令,由预处理器处理去替换代码,而typedef由编译器解释。通常在typedef有用武之地的时候,其比#define更为灵活

而typedef就本身而言,也对编程用户带来了一定的便利和灵活性

(1)同一种类型的不同叫法:同样是unsigned int类型,typedef使得用户能根据自己喜好或者项目要求自定义命名

typedef unsigned int USI;     /* 对unsigned int自定义的三个叫法 */
typedef unsigned int COUNT;
typedef unsigned int UINT;

USI a;     /* 看上去类型名不一样,但本质上这三个变量都是unsigned int的 */
COUNT b;   /* 换汤不换药而已 */
UINT c;    /* 编译器:“换了马甲我还认识你” */

这就等同于我们说孙悟空、齐天大圣、美猴王、行者孙、者行孙其实都是一个人(一种类型)

(2)同样的自定义名称不同的本质:例如同样是称作time_t类型,但不同系统中,其本质可能不同

/***************** 计算机系统1 *******************/
typedef unsigned int time_t;

/***************** 计算机系统2 *******************/
typedef unsigned long time_t;

这其实是因为time_t和size_t等这种类型,不太容易规定一种类型然后通用于所有计算机系统,所以不妨各个系统上的C保留这些说法

即都有time_t和size_t等常见自定义类型,方便用户识别,但各个系统的C的头文件中对其再各自typedef,以适合各自系统的要求即可

2、typedef的使用

如果是对一些基本数据类型进行自定义命名,格式是最简单的,上文已经用了不少了:

typedef unsigned char BYTE;     /* 可以表示BYTE类型的数据应当按字节的思路去处理而不是字符 */
typedef unsigned int COUNT;     /* 表示COUNT类型的数据用于计数 */
typedef unsigned long SUMMARY;  /* 表示SUMMARY类型的数据用于求和 */

指针类型也可以自定义,这里我们还可以再比较一下#define和typedef:

typedef char * t_string;     /* typedef形式的字符串类型 */
#define d_string char *;     /* #define形式的字符串类型 */

t_string str1, str2;   /* 此时,str1和str2都是char*类型的 */
d_string str3, str4;   /* 只有str3是指针类型的,str4不是 */

/*
	出现上面这种原因是#define本身的原理导致的,预处理指令只是在编译前事先处理一下代码
	比如#include将需要的代码库调入,即复制到本项目中,#define进行代码替换,而且是严格替换
	所以上面d_string str3, str4;被替换成了char * str3, str4;故编译后str4不是指针类型
*/

在操作系统的源码中,我们也在结构的定义处经常看到typedef的身影:

typedef struct pcb   /* 进程控制块 */
{
	unsigned int prio;      /* 进程优先级 */
	unsigned int needtime;  /* 进程需要的执行时间片 */
	……
}PCB;
/* 注意:该typedef是把pcb类型取名为PCB,struct末尾的PCB不是一个结构变量 */

typedef struct   /* 进程控制块,结构声明前省略取名 */
{
	unsigned int prio;      /* 进程优先级 */
	unsigned int needtime;  /* 进程需要的执行时间片 */
	……
}PCB;
/* 这也是比较常见的一种间接取名的方式 */

——参考《C Primer Plus第五版》

猜你喜欢

转载自blog.csdn.net/Johan_Joe_King/article/details/84279824