TYPEDEF,typedef用法详解
本文介绍了关键字typedef在C语言中的用法。
1.概述typedef是C语言的关键词,它的作用是将数据类型定义为一个新的名称。这里的数据类型包括内部数据类型(int,char等。)和用户定义的数据类型(struct等。).
2.用法使用typedef定义新类型的方法(步骤):在传统的变量声明表达式中,用new(类型名)替换变量名,然后在语句的开头加上关键字typedef。
下面用两个例子来描述typedef的使用步骤。
示例1:
【第一步】:int a;3354传统变量声明表达式
【第二步】:int Myint _ t;3354用新的类型名myint _ t替换变量A。
【第三步】:typedef int muint _ t;3354在语句开头添加typedef关键字,myint_t是我们定义的新类型。
示例2:
【第一步】:void(parr)(int a);3354传统函数指针变量声明表达式
【第二步】:void(parr)(int a);3354用新的类型名parr替换PARR
【第三步】:type df void(* parr)(int a);3354在语句开头添加typedef关键字,PARR是我们定义的新类型。
特别:以上两个例子只是为了演示typedef的使用步骤,新手容易理解。实际写代码的时候,只会把“步骤3”对应的语句写入代码!
3.角色1)1)typedef的一个重要用途是定义与机器无关的类型。例如,定义一个名为“FLOW”的浮点类型,它可以在目标机器上获得最高的精度:
typedef长双流;如果在不支持long double的机器上运行相关代码,只需修改相应的typedef语句,例如:
typedef双流;或者:
typedef浮点流;2)使用typedef为已有类型创建别名,为变量定义一个新的易记且含义明确的名称。例如:
typedef无符号整数单元;3)通过使用typedef简化一些复杂的类型声明,例如:
TypeVoid (* PARR) (char* ps,unsigned int pa)上面的语句引入了PARR type作为函数指针的同义词。parr type定义的指针将指向一个函数,该函数包含两个类型分别为char *和unsigned int的参数,以及一个类型为void的返回值。通常,当函数的参数是回调函数时,可以使用typedef来简化声明。
例如,上述示例的后续示例如下:
假设(const string ret,parr PARR,bool bOnlyOne)注意:第二个参数的类型名和变量名应该区分大小写。
上面代码的第一个参数是复制的变量本身,传递实参,或者不取形参就传递形参。
第二个参数是回调函数,所以对应的回调函数(parr)的地址以parr PARR(类型变量)的形式给出,第三个参数是布尔变量,类似于float、double等。
在这个例子中,如果不能用typedef来简化声明,那么假设的函数声明就会很复杂。因此,在一些负责任的函数声明中,有必要使用typedef来简化声明。
4.4.typedef和#define之间的区别如下:
1)#define用于简单的字符串替换。
2)typedef就是给一个类型起一个新名字。Typedef用于定义变量类型,其作用域仅限于已定义的函数或文件。宏定义没有这个功能。
一般来说,使用typedef比使用#define更好,尤其是有指针的时候。
示例1:
代码如下:
typedef char * parr1# define parr 2 char *;parr1 s1,S2;parr2 s3,S4;上述变量定义中,s1、s2、s3都定义为char类型;然而,s4被定义为char类型,而不是我们期望的指针变量char。这是因为#define只做简单的字符串替换,替换后的相关代码相当于:
char* s3,S4;当使用typedef为char*定义新类型的parr1时,相关代码等效于:
char *s3,* s4示例2:
代码如下:
typedef char * pStrchar string[5]= test ;const char*p1=字符串;const pStr p2=stringP1;p2;在编译期间,错误报告如下:
根据上面的错误信息,可以看出p2是一个只读常数,所以p2是错误的。这个问题再次提醒我们:typedef不同于#define,typedef不是简单的文本替换。在上面的代码中,const pStr p2不等于const char p2,pStr是作为类型存在的,所以const pStr p2实际上是一个p2变量,限制了pStr的类型,p2常量是只读的。也就是说,const pStr p2和pStr const p2本质上没有区别(可比const int p2和int const p2)。都是对变量p2的只读限制,只不过这里变量p2的数据类型是我们自己定义的pStr,而不是系统固有的类型(比如int)。
所以const pStr p2意味着数据类型为char的变量p2是只读的,所以p2是错误的。
注意:在这个例子中,typedef定义的新类型与编译系统中固有的类型没有什么不同。
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。