您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > Typedef用法小结
1Typedef与基本数据类型typedef声明,简称typedef,为现有数据类型创建一个新的名字。比如人们常常使用typedef来编写更美观和可读的代码。使用typedef为现有类型创建同义字。定义易于记忆的类型名。typedef使用昀多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于''typedef''关键字右边。例如:typedefintsize;此声明定义了一个int的同义字,名字为size。注意typedef并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要int的上下文中使用size:voidmeasure(size*psz);sizearray[4];sizelen=file.getlength();std::vectorvs;typedef还可以掩饰复合类型,如指针和数组。例如,你不用象下面这样重复定义有81个字符元素的数组:charline[81];chartext[81];定义一个typedef,每当要用到相同类型和大小的数组时,可以这样:typedefcharLine[81];Linetext,secondline;getline(text);同样,可以象下面这样隐藏指针语法:typedefchar*pstr;intmystrcmp(pstr,pstr);这里将带我们到达第一个typedef陷阱。标准函数strcmp()有两个‘constchar*'类型的参数。因此,它可能会误导人们象下面这样声明mystrcmp():intmystrcmp(constpstr,constpstr);用GNU的gcc和g++编译器,是会出现警告的,按照顺序,‘constpstr'被解释为‘constchar*‘(一个指向char的常量指针),而不是‘char*'(指向char的指针)。这个问题很容易解决:typedefconstcpstr;intmystrcmp(cpstr,cpstr);//现在是正确的。记住:不管什么时候,只要为指针声明typedef,那么都要在昀终的typedef名称中加一个const,以使得该指针本身是常量,而不是对象。2Typedef与结构体2.1 首先: 在C中定义一个结构体类型要用typedef:typedefstructStudent{inta;}Stu;于是在声明变量的时候就可以直接这样定义:Stustu1;如果没有typedef就必须用structStudentstu1;来声明变量stu1。这里的Stu实际上就是structStudent的别名。另外这里也可以不写Student,typedefstruct{inta;}Stu;但是也就不能这样定义了:structStudentstu1;而只能这样定义:Stustu1;2.2其次: 在c++中如果用typedef的话,又会造成区别:structStudent{inta;}stu1;//stu1是一个变量typedefstructStudent2{inta;}stu2;//stu2是一个结构体类型使用时可以直接访问stu1.a但是stu2则必须先stu2s2;然后s2.a=10;因为C和C++中对struct的应用是不同的。2.3 其他 掌握上面两条就可以了,不过昀后我们探讨个没多大关系的问题如果在c程序中我们写:typedefstruct{intnum;intage;}aaa,bbb,ccc;这算什么呢?我个人观察编译器(VC6)的理解,这相当于typedefstruct{intnum;intage;}aaa;typedefaaabbb;typedefaaaccc;也就是说aaa,bbb,ccc三者都是结构体类型。声明变量时用任何一个都可以,在c++中也是如此。但是你要注意的是这个在c++中如果写掉了typedef关键字,那么aaa,bbb,ccc将是截然不同的三个对象。3Typedef与enumtypedefenum表示定义了一个枚举型的数据结构。比如你用下面的方式进行定义:typedefenum{DWI_Nothing,DWI_2x2Icon,DWI_Icon,DWI_Text,DWI_FullText,DWI_CenterText,DWI_FullCenterText,DWI_None}DrawMenuItemType;你可以用上边的DrawMenuItemType去定义变量,例如:DrawMenuItemTypeData1Data1这个变量的取值就是DWI_Nothing,DWI_2x2Icon,DWI_Icon,DWI_Text,DWI_FullText,DWI_CenterText,DWI_FullCenterText,DWI_None中的一个,这些你都可以自己取值。如果你不赋值的话,默认第一个取值为零,其后面的依次加1。如果你给DWI_Nothing取值为m,相应的它后面的没有显示赋值的就要在这个基础上依次加1,直到遇到显示赋值的为止。DWI_2x2Icon的值为m+1;DWI_Icon的值为m+2.4Typedef与函数指针4.1简单的函数指针的应用。 //形式1:返回类型(*函数名)(参数表)char(*pFun)(int);charglFun(inta){return4;}voidmain(){pFun=glFun;(*pFun)(2);}第一行定义了一个指针变量pFun。首先我们根据前面提到的“形式1”认识到它是一个指向某种函数的指针,这种函数参数是一个int型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。第二行定义了一个函数glFun()。该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址然后就是main()函数了,它的第一句您应该看得懂了——它将函数glFun的地址赋值给变量pFun。main()函数的第二句中*pFun显然是取pFun所指向地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。4.2使用typedef //形式2:typedef返回类型(*新类型)(参数表)typedefchar(*PTRFUN)(int);PTRFUNpFun;charglFun(inta){Return4;}voidmain(){pFun=glFun;(*pFun)(2);}typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。第二行的代码便使用这个新类型定义了变量pFun,此时就可以像使用形式1一样使用这个变量了。5Typedef与#define5.1#define用法 #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如:#definePI3.1415926程序中的:area=PI*r*r会替换为3.1415926*r*r如果你把#define语句中的数字9写成字母g预处理也照样带入。5.2 typedef与#define的区别 typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名。typedefint*int_ptr;#defineint_ptrint*作用都是用int_ptr代表int*,但是二者不同,正如前面所说,#define在预处理时进行简单的替换,而typedef不是简单替换,而是采用如同定义变量的方法那样来声明一种类型。也就是说;#defineint_ptrint*int_ptra,b;//相当于int*a,b;只是简单的宏替换typedefint*int_ptr;int_ptra,b;//a,b都为指向int的指针,typedef为int*引入了一个新的助记符这也说明了为什么下面观点成立//QunKangLi(维护成本与程序员的创造力的平方成正比)typedefint*pint;#definePINTint*那么:constpintp;//p不可更改,但p指向的内容可更改constPINTp;//p可更改,但是p指向的内容不可更改。pint是一种指针类型constpintp就是把指针给锁住了p不可更改而constPINTp是constint*p锁的是指针p所指的对象。注:#define不是语句不要在行末加分号,否则会连分号一块置换。
本文标题:Typedef用法小结
链接地址:https://www.777doc.com/doc-5400888 .html