首页 > 编程知识 正文

typedef英语,typedef结构体

时间:2023-05-04 19:22:08 阅读:119904 作者:4474

[20210330更新]:这个博客写的时间有点长: )。 在这次更新中,修正了博客内容的错误和表达不恰当的地方。

本文介绍了c语言关键字typedef的使用方法。

1概述typedef是c语言的关键字,用于为内部数据类型(int、char等)和自定义数据类型(struct等)定义新名称。

typedef本身是存储类的关键字,不能与auto、extern、static、register等关键字包含在同一表达式中。

2作用和用法2.1 typedef用法使用typedef定义新类型的方法(步骤)。 在传统的变量声明表达式中,用(新的)类型名代替变量名,并将关键字typedef添加到该语句的开头即可。

用两个例子说明typedef的使用步骤。

示例1:

【第一步】: int a; ————传统变量声明表达式

【步骤2】: int myint_t; 将————变量名称a替换为新类型名称myint_t

【步骤3】: typedef int myint_t; 在————语句的开头添加typedef关键字,myint_t是我们定义的新类型

示例2:

【第一步】: void(*pfuna ) int a ); ————传统变量(函数)声明表达式

【步骤2】:语音(* pfuna )输入a ); 将————变量名PFUNA替换为新类型名PFUNA

【步骤3】: typedefvoid(*pfuna ) ) int a ); 如果在————语句的开头加上typedef关键字,则PFUNA是我们定义的新类型

特别强调:上述两个示例便于初学者记住typedef的使用方法,只是为了演示如何使用typedef的步骤。 实际编写代码时,只有与“步骤3”对应的语句才会写入代码中!

2.2泰普德夫的作用泰普德夫的作用有以下几点。

1)typedef 的一个重要用途是定义机器无关的类型。例如,定义一个名为" REAL "的浮点类型。 这个浮点型可以在目标机器上获得最高的精度。

类型长双精度; 如果要在不支持long double的计算机上执行相关代码,只需修改相应的typedef语句,例如:

类型双现实; 或:

类型浮动实时;2)使用 typedef 为现有类型创建别名,给变量定义一个易于记忆且意义明确的新名字。例如:

typedefunsignedintuint http://www.Sina.com /,例如:

typedefvoid(*pfuncallback ) ) char* pMsg,unsigned int nMsgLen ); 上述声明引入了PFunCallBack类型作为函数指针的同义词,该指针具有两种类型: char*和unsigned int以及void返回值。 通常,如果某个函数的参数是回调函数,则可能会使用typedef简化声明。

例如,接上面的例子,举以下例子。

redis sub command (conststringstrkey,PFunCallBack pFunCallback,bool bOnlyOne );3)使用 typedef 简化一些比较复杂的类型声明类型名称PFunCallBack和变量名PFunCallBack的大小写差异。

RedisSubCommand函数的参数是一个返回某个函数(PFunCallBack )地址的PFunCallBack回调函数。 在此示例中,如果不使用typedef,则RedisSubCommand函数声明如下:

redis sub command (conststringstrkey,void ) pfuncallback ) char* pMsg,unsigned int nMsgLen ),bool bOnlyOne ); 从上面的两个函数声明可以看出,如果不使用typedef,则RedisSubCommand函数的声明非常复杂,不利于代码的理解,并且错误风险很高。

因此,一些复杂的类型声明需要使用typedef简化声明。

3 typedef和#define的区别如下。

#define可轻松替换字符串。 可以使用#ifdef、#ifndef等从逻辑上判断#define宏的定义,也可以使用#undef取消定义。 typedef是为类型指定新名称。 typedef符合(c语言)范围规则,可以使用

typedef 定义的变量类型,其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。

通常,使用 typedef 要比使用 #define 要好,特别是在有指针的场合里。

下面列举几个示例。

3.1 示例1

代码如下:

typedef char* pStr1;#define pStr2 char* pStr1 s1, s2;pStr2 s3, s4;

在上述的变量定义中,s1、s2、s3都被定义为 char* 类型;但是s4则定义成了 char 类型,而不是我们所预期的指针变量 char*,这是因为 #define 只做简单的字符串替换,替换后的相关代码等同于为:

char* s3, s4;

而使用 typedef 为 char* 定义了新类型 pStr1 后,相关代码等同于为:

char *s3, *s4; 3.1 示例2

代码如下:

typedef char *pStr;char string[5]="test";const char *p1=string;const pStr p2=string;p1++;p2++;

在编译过程中,报错如下:

根据上述错误信息能够看出,p2 为只读常量,所以 p2++ 出错了。这个问题再一次提醒我们:typedef 和 #define 不同,typedef 不是简单的文本替换,上述代码中 const pStr p2 并不等于 const char * p2,pStr 是作为一个类型存在的,所以 const pStr p2 实际上是限制了 pStr 类型的 p2 变量,对 p2 常量进行了只读限制。也就是说,const pStr p2 和 pStr const p2 本质上没有区别(可类比 const int p2 和 int const p2),都是对变量 p2 进行只读限制,只不过此处变量 p2 的数据类型是我们自己定义的 pStr,而不是系统固有类型(如 int)而已。

所以,const pStr p2 的含义是:限定数据类型为 char * 的变量 p2 为只读,因此 p2++ 错误。

注意:在本示例中,typedef 定义的新类型与编译系统固有的类型没有差别。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。