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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。