c++中的typedef关键字,C语言typedef详解

  c++中的typedef关键字,C语言typedef详解

  C语言中有一个typedef关键字,用来定义用户自定义类型。当然,我们并不是真的创建一个数据类型,而是给现有的或者符合和复杂的数据类型起一个别名,让我们更容易理解。总之,我们可以使用typedef关键字来定义我们自己的类型名。

  那么,它是如何定义的,在什么情况下可以使用呢?接下来,我们将解释它的几种用法:

  (1)基本数据类型的定义

  有时,我们使用typedef关键字来重新定义一些基本的数据类型。例如,当我们使用标准整数数据类型uint8_t和uint16_t时,它们实际上定义如下:

  typedef无符号字符uint 8 _ t;//无符号8位数

  typedef有符号字符int 8 _ t;//带符号的8位数字

  typedef无符号int uint 16 _ t;//无符号的16位数字

  typedef有符号int int 16 _ t;//带符号的16位数字

  typedef无符号长整型uint 32 _ t;//无符号的32位数字

  typedef有符号长整型int 32 _ t;//带符号的32位数字

  显然,typedef关键字用于为现有数据类型分配别名。当我们使用uint8_t时,它与使用unsigned char是一样的。当我们声明uint8_t var时,和使用无符号char var是一回事。

  (2)指针数据类型的定义

  有时我们也会使用typedef关键字来定义指针数据类型,以简化我们使用的指针变量的声明。

  示例:typedef int * pointer

  这样,我们定义了一个指针类型。当我们用pointerp声明一个指针变量的时候,和用int *p p的意思是一样的。

  以上是一个指针变量类型,可以有很多用途。例如,定义数组对象可以更加明确。有时候,我们还会定义一个指向两位数组行的指针,使用typedef关键字可以让操作更符合我们的常规认知。

  示例:typedef int(* pointer)[N];

  这里指针等价于int (*)[N],当我们声明指针p时,等价于声明int (*a)[N]。同样,如果我们对二维数组采用类似的定义。

  示例:typedef int array[M][N];

  其含义与指针相似。例如,当我们定义数组a时,我们声明了一个M行N列的数组。这时候就可以用P=A了。

  考虑到数组往往可以用指针来表示,我们一起讨论,其他对象指针单独讨论。实际上,不仅上面提到的数组和指针可以使用typedef关键字来定义别名,其他如一维和多位数组以及指针数组也可以这样使用。

  (3)用户对象类型的定义

  首先,这里所说的用户对象是指用户自定义的数据类型,如结构、并集、枚举等。我们可以使用typedef关键字为结构和其他类型定义一个别名,这样我们就可以在很多地方更方便地使用它。当然很多人对此有不同的看法,这里就不讨论了。我们只是说有这个用法。

  使用typedef关键字为结构类型定义别名。

  示例:typedef结构{

  浮动设定值;/*设定值*/

  浮动KP;/*比例因子*/

  浮动ki;/*积分系数*/

  浮动KD;/*微分系数*/

  float lasterror/*先前节拍偏差*/

  浮点预误差;/*前两拍的偏差*/

  浮动死区;/*死区*/

  浮点结果;/*PID控制器的计算结果*/

  浮点输出;/*输出值0-100%*/

  浮动最大值;/*输出值上限*/

  浮动最小值;/*输出值下限*/

  浮点误差absmax;/*最大偏差绝对值*/

  float errorabsmin/*绝对偏差的最小值*/

  浮动;/*不完全微分系数*/

  浮点deltadiff/*微分增量*/

  浮点integralValue/*累计积分数*/

  浮动伽马;/*微分滤波器系数*/

  float lastPv/*最后一拍的过程测量值*/

  float lastDeltaPv/*最后一次心跳测量值的增量*/

  } CLASSICPID

  这样,当我们需要使用结构类型定义一个对象时,我们可以使用CLASSICPID vPID,它与原始定义相同。

  我们还可以使用typedef关键字来定义枚举类型的别名。

  示例:typedef枚举{

  FC _ REG _ WRITE=((uint8 _ t)0x80),/*写入寄存器的功能代码*/

  FC_REG_Read=((uint8_t)0x81),/*读取寄存器的功能代码*/

  Fc _ var _ write=((uint8 _ t)0x82),/*写变量的函数代码*/

  FC_VAR_Read=((uint8_t)0x83),/*读取变量的函数代码*/

  fc _ curve _ Write=((uint 8 _ t)0x 84)/*编写曲线缓冲区的功能代码*/

  } DwinFunctionCode

  当我们需要定义枚举变量时,也可以使用DwinFunctionCode fc。当然,我们也可以用定义的类型声明指针变量,或者直接用typedef关键字定义指向对象的指针类型,比如定义结构的指针类型。

  (4)函数类型的定义

  typedef关键字还通常用于定义函数类型,以及声明相同类型的函数或函数指针变量。当函数用作回调(如参数)时,这种类型定义非常有用。具体用法请参考回调函数的使用。

  使用typedef关键字定义函数类型和以前的定义方法。

  例如:typedef int fType(void);

  这里fType等价于int (void)类型函数。如果我们用fType函数来声明function,和用int函数(void)是一样的。

  我们也可以使用fType来定义函数指针。如果我们用fType *fPointer声明函数指针fPointer,和用int (*fPointer)(void)声明是一样的。

  当然,我们也可以使用typedef关键字直接定义函数指针类型。

  例如:typedef int(* fPointer)(void);

  这样我们就可以用fPointer来定义一个函数指针了。如果我们用fPointer fp声明一个函数指针,就跟用int (*fp)(void)声明一样。

  (5)typedef关键字和宏定义

  我们已经解释了typedef关键字的基本用法。但是我们发现它的功能是依赖宏定义才能实现的,那么我们来解释一下typedef关键字和#define定义的宏的区别。

  在功能范围上是有区别的。typedef主要是取一个别名,对于现有的关键字或者类型以及它们的组合,我们很容易识别。此时,#define也可以实现,但是#define除了第一次还有很多其他用途。如果你愿意,你可以用它来定义任何代码,这是typedef没有的。

  执行时间也不一样。对于#define定义的宏,它将在预处理阶段被替换。typedef定义的类型是在编译时处理的。

  行动上也有区别。一般来说,#define定义的宏对动作没有限制,只要在使用前定义即可。typedef定义的别名对于。

  实施效果也有区别。我们用typedef定义一个指针类型,然后用这个类型同时声明所有变量,但是#define不是这样。如typedef(int *)pType;可以用pType a,b;这里,A和B是指向整数的指针变量。但是我们也定义了#define pType int*。如果使用pType a、b;定义A和B,那么A是一个指向整数的指针变量,而B不是。

  欢迎关注:

  想更方便及时的阅读相关文章,请关注我的微信微信官方账号【木南创智】

  转载请联系作者取得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: