C-C++中typedef--struct用法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1.由于对typedef理解不够,因此从网上摘录了一些资料,整理如下:2.3.C/C++中typedefstruct和struct的用法4.5.struct_x1{...}x1;和typedefstruct_x2{...}x2;有什么不同?6.7.8.其实,前者是定义了类_x1和_x1的对象实例x1,后者是定义了类_x2和_x2的类别名x2,9.10.所以它们在使用过程中是有取别的.请看实例1.11.12.[知识点]13.14.结构也是一种数据类型,可以使用结构变量,因此,象其它类型的变量一样,在使用结构变量时要先对其定义。15.16.定义结构变量的一般格式为:17.18.struct结构名19.20.{21.22.类型变量名;23.24.类型变量名;25.26....27.28.}结构变量;29.30.结构名是结构的标识符不是变量名。31.32.33.34.另一种常用格式为:35.36.37.38.typedefstruct结构名39.40.{41.42.类型变量名;43.44.类型变量名;45.46....47.48.}结构别名;49.50.51.52.53.54.另外注意:在C中,struct不能包含函数。在C++中,对struct进行了扩展,可以包含函数。55.56.57.58.======================================================================59.60.61.62.实例1:struct.cpp63.64.65.66.#includeiostream67.68.usingnamespacestd;69.70.typedefstruct_point{71.72.intx;73.74.inty;75.76.}point;//定义类,给类一个别名77.78.79.80.struct_hello{81.82.intx,y;83.84.}hello;//同时定义类和对象85.86.87.88.89.90.intmain()91.92.{93.94.pointpt1;95.96.pt1.x=2;97.98.pt1.y=5;99.100.coutptpt1.x=pt1.xpt.y=pt1.yendl;101.102.103.104.//hellopt2;105.106.//pt2.x=8;107.108.//pt2.y=10;109.110.//coutpt2pt2.x=pt2.xpt2.y=pt2.yendl;111.112.//上面的hellopt2;这一行编译将不能通过.为什么?113.114.//因为hello是被定义了的对象实例了.115.116.//正确做法如下:用hello.x和hello.y117.118.119.120.hello.x=8;121.122.hello.y=10;123.124.couthellohello.x=hello.xhello.y=hello.yendl;125.126.127.128.return0;129.130.}131.132.133.134.135.136.typedefstruct与struct的区别137.138.1.基本解释139.140.typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。141.142.143.144.在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。145.146.147.148.至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。149.150.151.152.2.typedef&结构的问题153.154.155.156.当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明:157.158.159.160.typedefstructtagNode161.162.{163.164.char*pItem;165.166.pNodepNext;167.168.}*pNode;169.170.171.172.答案与分析:173.174.175.176.1、typedef的最简单使用177.178.179.180.typedeflongbyte_4;181.182.183.184.给已知数据类型long起个新名字,叫byte_4。185.186.187.188.2、typedef与结构结合使用189.190.191.192.typedefstructtagMyStruct193.194.{195.196.intiNum;197.198.longlLength;199.200.}MyStruct;201.202.203.204.这语句实际上完成两个操作:205.206.207.208.1)定义一个新的结构类型209.210.211.212.structtagMyStruct213.214.{215.216.intiNum;217.218.longlLength;219.220.};221.222.223.224.分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。225.226.227.228.我们可以用structtagMyStructvarName来定义变量,但要注意,使用tagMyStructvarName来定义变量是不对的,因为struct和tagMyStruct合在一起才能表示一个结构类型。229.230.231.232.2)typedef为这个新的结构起了一个名字,叫MyStruct。233.234.235.236.typedefstructtagMyStructMyStruct;237.238.239.240.因此,MyStruct实际上相当于structtagMyStruct,我们可以使用MyStructvarName来定义变量。241.242.243.244.答案与分析245.246.247.248.C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。249.250.251.252.根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。253.254.255.256.解决这个问题的方法有多种:257.258.1)、259.260.261.262.typedefstructtagNode263.264.{265.266.char*pItem;267.268.structtagNode*pNext;269.270.}*pNode;271.272.2)、273.274.275.276.typedefstructtagNode*pNode;277.278.structtagNode279.280.{281.282.char*pItem;283.284.pNodepNext;285.286.};287.288.289.290.注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。291.292.3)、规范做法:293.294.295.296.structtagNode297.298.{299.300.char*pItem;301.302.structtagNode*pNext;303.304.};305.306.typedefstructtagNode*pNode;307.308.309.310.311.312.C++中typedef关键字的用法313.314.Typedef声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法。不管怎样,使用typedef能为代码带来意想不到的好处,通过本文你可以学习用typedef避免缺欠,从而使代码更健壮。315.316.typedef声明,简称typedef,为现有类型创建一个新的名字。比如人们常常使用typedef来编写更美观和可读的代码。所谓美观,意指typedef能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示typedef强大功能以及如何避免一些常见的陷阱。317.318.如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法?319.320.321.322.使用typedefs为现有类型创建同义字。定义易于记忆的类型名323.324.typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于''typedef''关键字右边。例如:typedefintsize;325.326.此声明定义了一个int的同义字,名字为size。注意typedef并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要int的上下文中使用size:voidmeasure(size*psz);327.328.sizearray[4];329.330.sizelen=file.getlength();331.332.std::vectorsizevs;333.334.typedef还可以掩饰符合类型,如指针和数组。例如,你不用象下面这样重复定义有81个字符元素的数组:charline[81];335.336.chartext[81];337.338.定义一个typedef,每当要用到相同类型和大小的数组时,可以这样:typedefcharLine[81];339.340.Linetext,secondline;341.342.getline(text);343.344.同样,可以象下面这样隐藏指针语法:typedefchar*pstr;345.346.intmystrcmp(pstr,pstr);347.348.这里将带我们到达第一个typedef陷阱。标准函数strcmp()有两个‘constchar*'类型的参数。因此,它可能会误导人们象下面这样声明mystrcmp():intmystrcmp(constpstr,constpstr);349.350.这是错误的,按照顺序,‘constpstr'被解释为‘char*const'(一个指向char的常量指针),而不是‘constchar*'(指向常量char的指针)。这个问题很容易解决:typedefconstchar*cpstr;351.352.intmystrcmp(cpstr,cpstr);//现在是正确的353.354.记住:不管什么时候,只要为指针声明typedef,那么都要在最终的typedef名称中加一个const,以使得该指针本身是常量,而不是对象。代码简化355.356.上面讨论的typedef行为有点像#define宏,用其实际类型替代同义字。不同点是typedef在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。例如:typedefint(*PF)(constchar*,constchar*);357.358.这个声明引入了PF类型作为函数指针的同义字,该函数有两个constchar*类型的参数以及一个int类型的返回值。如果要使用下列形式的函数声明,那么上述这个typedef是不可或缺的:PFRegister(PFpf);359.360.Register()的参数是一个PF类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同。做一次深呼吸。下

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功