C语言中的关键字-typedef之理解和使用

来源:互联网 发布:baoer软件 编辑:程序博客网 时间:2024/05/21 17:12
                                                            20170726 --iRonMan

C语言允许用户使用typedef关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称。

举个简单的例子,C语言在C99之前并未提供布尔类型,但我们可以使用typedef关键字来定义一个简单的布尔类型,如下

typedef int BOOL;   //给int基本类型去了新名字BOOL#define TRUE  1     //定义TRUE为1,即可以用TRUE来表示1(为真)#define FALSE 0

定义好之后就可以像使用基本类型一样使用定义的BOOL

BOOL bflag=TRUE;   //等价于 int bflag=1

学习C语言,应该对typedef的四种应用形式有所掌握。

1.为基本数据类型定义新的类型名

定义与平台无关的类型,即不管在什么平台上都可以使用这个新的类型名,有利于跨平台移植程序

比如,要定义一个叫REAL的浮点类型,在目标平台1上,让它表示最高精度的浮点类型,即

typedef long double REAL;

在不支持long double 的平台2上,改为

typedef double REAL;

甚至还可以连double都不支持的平台3上,改为

typedef float REAL;

这样,当移植程序时,我们只需要修改一下typedef 的定义即可,而不用对源代码中出现的同种数据类型一个一个修改。惊不惊喜~

2.为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称
以结构体为例,定义一个名为Point的结构体:

struct Point   {    double x;    double y;    double z;}; //注意别忘了分号

此时结构体struct Point 为新的数据类型,调用这个结构体来定义变量时必须保留字struct,而不能像int 和 double一样直接使用。当使用的次数多了是不是显得很麻烦?

调用

struct Point oPoint1={100,100,0};  //定义一个结构体oPoint1并初始化struct Point oPoint2;

用typedef 定义这个结构体,如下:

typedef struct tagPoint      //这部分代码分成两部分{                            //(1)定义tagPoint结构体,构成新的结构类型struct tagPoint     double x;                //(2)使用typedef为这个结构体取一个别名Point    double y;                //即typedef  struct tagPoint  Point;    double z;}Point;

另外,这里做一下延伸,记录一下可能编译器会报错的点:

typedef struct tagNode{    char *pItem;    pNode pNext;    } *pNode;

上面这个结构体中,错在哪里呢?可能有人会觉得错在结构体中包含了指向自己的指针,但真是这样吗?其实,C语言允许结构体中包含指向自己的指针。究其原因,根本问题在于typedef的应用。

在结构体的建立中遇到了pNext声明,其类型是pNode, 但是结构体本身还没建立完,编译器还不认识pNode是谁,所以自然会报错。那要怎么改?

typedef struct tagNode{    char *pItem;    struct tagNode *pNext; //*是跟着结构体的,struct tagNode *} *pNode;

3.为数组定义简洁的类型名称

typedef int INT_ARRAY_100[100];INT_ARRAY_100 arr;

4.为指针定义简洁的名称

typedef char* PCHAR;PCHAR pa; //==char* pa

上面的指针比较简单,使用typedef看起来意义不大,但是遇到复杂的情况,优势就出来了:

//PFun是我们创建的一个类型别名typedef int *(*PFun)(int, char*);//使用定义的新类型来声明对象,等价于int *(*a[5])(int, char*);PFun a[5];

ok,关于关键词typedef的用法介绍就到此结束啦,这些内容是看了马伟先生著的 ‘Writing Solid Code’ 后的一些收获。要是朋友们有什么补充的还请不吝赐教~

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 奶猫半夜不睡觉怎么办 龙猫不喜欢吃草粒怎么办 龙猫一直在发抖怎么办 龙猫牙齿掉了怎么办 龙猫晚上很吵怎么办 小狗把手咬破了怎么办 夏天仓鼠太热了怎么办 仓鼠玩转轮会摔怎么办 如何发截图不会发现吐怎么办 嘴巴烂了药过敏怎么办 非法校车被扣了怎么办 手指削掉一块肉怎么办 在广州误走brt道怎么办 平安eq测试没过怎么办 物业在小区私自建房怎么办 婚后父母出钱买房离婚怎么办 情人忙工作没时间约会怎么办 情人很忙不主动联系我怎么办 丈夫毫不关心基督徒妻子怎么办 眼睛太小怎么办不整容 被野生猴子咬了怎么办 被野猴子抓伤了怎么办 孩子入学前疫苗补不全怎么办 额头肤色比脸黑怎么办 高跟鞋小了挤脚怎么办 老板欠工人工资不给怎么办 小孩吃了生豆子怎么办 拍夜晚的天空太亮怎么办 购房发票字体不清晰怎么办 接到客人电话预定时怎么办 产检资料弄丢了怎么办 工作中同事喜欢争风头怎么办 想出卖身体赚钱了怎么办 孩子生下来不想要了怎么办 舌头被铁管冻住怎么办 人被水泥冻住了怎么办 姑娘果孕妇吃了怎么办 纹身后吃了辣的怎么办 怀孕五个多月不想要了怎么办 失业后又干保安档案怎么办 前列大腺脓肿要怎么办