




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C/C+中typedef struct和struct的用法xml 代碼1. 由于對(duì)typedef理解不夠,因此從網(wǎng)上摘錄了一些資料,整理如下: 2. 3. C/C+中typedefstruct和struct的用法 4. 5. struct_x1.x1;和typedefstruct_x2.x2;有什么不同? 6. 7. 8. 其實(shí),前者是定義了類(lèi)_x1和_x1的對(duì)象實(shí)例x1,后者是定義了類(lèi)_x2和_x2的類(lèi)別名x2, 9. 10. 所以它們?cè)谑褂眠^(guò)程中是有取別的.請(qǐng)看實(shí)例1. 11. 12. 知識(shí)點(diǎn) 13. 14. 結(jié)構(gòu)也是一種數(shù)據(jù)類(lèi)型,可以使用結(jié)構(gòu)變量,因此,象其它類(lèi)型的變量一樣,在使用結(jié)構(gòu)變
2、量時(shí)要先對(duì)其定義。 15. 16. 定義結(jié)構(gòu)變量的一般格式為: 17. 18. struct結(jié)構(gòu)名 19. 20. 21. 22. 類(lèi)型變量名; 23. 24. 類(lèi)型變量名; 25. 26. . 27. 28. 結(jié)構(gòu)變量; 29. 30. 結(jié)構(gòu)名是結(jié)構(gòu)的標(biāo)識(shí)符不是變量名。 31. 32. 33. 34. 另一種常用格式為: 35. 36. 1 / 1537. 38. typedefstruct結(jié)構(gòu)名 39. 40. 41. 42. 類(lèi)型變量名; 43. 44. 類(lèi)型變量名; 45. 46. . 47. 48. 結(jié)構(gòu)別名; 49. 50. 51. 52. 53. 54. 另外注意:在C中,str
3、uct不能包含函數(shù)。在C+中,對(duì)struct進(jìn)行了擴(kuò)展,可以包含函數(shù)。 55. 56. 57. 58. = 59. 60. 61. 62. 實(shí)例1:struct.cpp 63. 64. 65. 66. #include 67. 68. usingnamespacestd; 69. 70. typedefstruct_point 71. 72. intx; 73. 74. inty; 75. 76. point;/定義類(lèi),給類(lèi)一個(gè)別名 77. 78. 79. 80. struct_hello 81. 82. intx,y; 83. 84. hello;/同時(shí)定義類(lèi)和對(duì)象 85. 86. 87.
4、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;這一行編譯將不能通過(guò).為什么? 113. 114. /因?yàn)閔ello是
5、被定義了的對(duì)象實(shí)例了. 115. 116. /正確做法如下:用hello.x和hello.y 117. 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的區(qū)別 137. 138. 1.基本解釋 139. 140. typedef為C語(yǔ)言的關(guān)鍵字,作用是為一種數(shù)據(jù)類(lèi)
6、型定義一個(gè)新名字。這里的數(shù)據(jù)類(lèi)型包括內(nèi)部數(shù)據(jù)類(lèi)型(int,char等)和自定義的數(shù)據(jù)類(lèi)型(struct等)。 141. 142. 143. 144. 在編程中使用typedef目的一般有兩個(gè),一個(gè)是給變量一個(gè)易記且意義明確的新名字,另一個(gè)是簡(jiǎn)化一些比較復(fù)雜的類(lèi)型聲明。 145. 146. 147. 148. 至于typedef有什么微妙之處,請(qǐng)你接著看下面對(duì)幾個(gè)問(wèn)題的具體闡述。 149. 150. 151. 152. 2.typedef&結(jié)構(gòu)的問(wèn)題 153. 154. 155. 156. 當(dāng)用下面的代碼定義一個(gè)結(jié)構(gòu)時(shí),編譯器報(bào)了一個(gè)錯(cuò)誤,為什么呢?莫非C語(yǔ)言不允許在結(jié)構(gòu)中包含指向它自己的指針嗎
7、?請(qǐng)你先猜想一下,然后看下文說(shuō)明: 157. 158. 159. 160. typedefstructtagNode 161. 162. 163. 164. char*pItem; 165. 166. pNodepNext; 167. 168. *pNode; 169. 170. 171. 172. 答案與分析: 173. 174. 175. 176. 1、typedef的最簡(jiǎn)單使用 177. 178. 179. 180. typedeflongbyte_4; 181. 182. 183. 184. 給已知數(shù)據(jù)類(lèi)型long起個(gè)新名字,叫byte_4。 185. 186. 187. 188. 2
8、、typedef與結(jié)構(gòu)結(jié)合使用 189. 190. 191. 192. typedefstructtagMyStruct 193. 194. 195. 196. intiNum; 197. 198. longlLength; 199. 200. MyStruct; 201. 202. 203. 204. 這語(yǔ)句實(shí)際上完成兩個(gè)操作: 205. 206. 207. 208. 1)定義一個(gè)新的結(jié)構(gòu)類(lèi)型 209. 210. 211. 212. structtagMyStruct 213. 214. 215. 216. intiNum; 217. 218. longlLength; 219. 220.
9、; 221. 222. 223. 224. 分析:tagMyStruct稱(chēng)為“tag”,即“標(biāo)簽”,實(shí)際上是一個(gè)臨時(shí)名字,struct關(guān)鍵字和tagMyStruct一起,構(gòu)成了這個(gè)結(jié)構(gòu)類(lèi)型,不論是否有typedef,這個(gè)結(jié)構(gòu)都存在。 225. 226. 227. 228. 我們可以用structtagMyStructvarName來(lái)定義變量,但要注意,使用tagMyStructvarName來(lái)定義變量是不對(duì)的,因?yàn)閟truct和tagMyStruct合在一起才能表示一個(gè)結(jié)構(gòu)類(lèi)型。 229. 230. 231. 232. 2)typedef為這個(gè)新的結(jié)構(gòu)起了一個(gè)名字,叫MyStruct。 233
10、. 234. 235. 236. typedefstructtagMyStructMyStruct; 237. 238. 239. 240. 因此,MyStruct實(shí)際上相當(dāng)于structtagMyStruct,我們可以使用MyStructvarName來(lái)定義變量。 241. 242. 243. 244. 答案與分析 245. 246. 247. 248. C語(yǔ)言當(dāng)然允許在結(jié)構(gòu)中包含指向它自己的指針,我們可以在建立鏈表等數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)上看到無(wú)數(shù)這樣的例子,上述代碼的根本問(wèn)題在于typedef的應(yīng)用。 249. 250. 251. 252. 根據(jù)我們上面的闡述可以知道:新結(jié)構(gòu)建立的過(guò)程中遇到了p
11、Next域的聲明,類(lèi)型是pNode,要知道pNode表示的是類(lèi)型的新名字,那么在類(lèi)型本身還沒(méi)有建立完成的時(shí)候,這個(gè)類(lèi)型的新名字也還不存在,也就是說(shuō)這個(gè)時(shí)候編譯器根本不認(rèn)識(shí)pNode。 253. 254. 255. 256. 解決這個(gè)問(wèn)題的方法有多種: 257. 258. 1)、 259. 260. 261. 262. typedefstructtagNode 263. 264. 265. 266. char*pItem; 267. 268. structtagNode*pNext; 269. 270. *pNode; 271. 272. 2)、 273. 274. 275. 276. type
12、defstructtagNode*pNode; 277. 278. structtagNode 279. 280. 281. 282. char*pItem; 283. 284. pNodepNext; 285. 286. ; 287. 288. 289. 290. 注意:在這個(gè)例子中,你用typedef給一個(gè)還未完全聲明的類(lèi)型起新名字。C語(yǔ)言編譯器支持這種做法。 291. 292. 3)、規(guī)范做法: 293. 294. 295. 296. structtagNode 297. 298. 299. 300. char*pItem; 301. 302. structtagNode*pNext;
13、303. 304. ; 305. 306. typedefstructtagNode*pNode; 307. 308. 309. 310. 311. 312. C+中typedef關(guān)鍵字的用法 313. 314. Typedef聲明有助于創(chuàng)建平臺(tái)無(wú)關(guān)類(lèi)型,甚至能隱藏復(fù)雜和難以理解的語(yǔ)法。不管怎樣,使用typedef能為代碼帶來(lái)意想不到的好處,通過(guò)本文你可以學(xué)習(xí)用typedef避免缺欠,從而使代碼更健壯。 315. 316. typedef聲明,簡(jiǎn)稱(chēng)typedef,為現(xiàn)有類(lèi)型創(chuàng)建一個(gè)新的名字。比如人們常常使用typedef來(lái)編寫(xiě)更美觀和可讀的代碼。所謂美觀,意指typedef能隱藏笨拙的語(yǔ)法構(gòu)造
14、以及平臺(tái)相關(guān)的數(shù)據(jù)類(lèi)型,從而增強(qiáng)可移植性和以及未來(lái)的可維護(hù)性。本文下面將竭盡全力來(lái)揭示typedef強(qiáng)大功能以及如何避免一些常見(jiàn)的陷阱。 317. 318. 如何創(chuàng)建平臺(tái)無(wú)關(guān)的數(shù)據(jù)類(lèi)型,隱藏笨拙且難以理解的語(yǔ)法? 319. 320. 321. 322. 使用typedefs為現(xiàn)有類(lèi)型創(chuàng)建同義字。定義易于記憶的類(lèi)型名 323. 324. typedef使用最多的地方是創(chuàng)建易于記憶的類(lèi)型名,用它來(lái)歸檔程序員的意圖。類(lèi)型出現(xiàn)在所聲明的變量名字中,位于typedef關(guān)鍵字右邊。例如:typedefintsize; 325. 326. 此聲明定義了一個(gè)int的同義字,名字為size。注意typedef并
15、不創(chuàng)建新的類(lèi)型。它僅僅為現(xiàn)有類(lèi)型添加一個(gè)同義字。你可以在任何需要int的上下文中使用size:voidmeasure(size*psz); 327. 328. sizearray4; 329. 330. sizelen=file.getlength(); 331. 332. std:vectorvs; 333. 334. typedef還可以掩飾符合類(lèi)型,如指針和數(shù)組。例如,你不用象下面這樣重復(fù)定義有81個(gè)字符元素的數(shù)組:charline81; 335. 336. chartext81; 337. 338. 定義一個(gè)typedef,每當(dāng)要用到相同類(lèi)型和大小的數(shù)組時(shí),可以這樣:typedefch
16、arLine81; 339. 340. Linetext,secondline; 341. 342. getline(text); 343. 344. 同樣,可以象下面這樣隱藏指針語(yǔ)法:typedefchar*pstr; 345. 346. intmystrcmp(pstr,pstr); 347. 348. 這里將帶我們到達(dá)第一個(gè)typedef陷阱。標(biāo)準(zhǔn)函數(shù)strcmp()有兩個(gè)constchar*類(lèi)型的參數(shù)。因此,它可能會(huì)誤導(dǎo)人們象下面這樣聲明mystrcmp():intmystrcmp(constpstr,constpstr); 349. 350. 這是錯(cuò)誤的,按照順序,constpstr
17、被解釋為char*const(一個(gè)指向char的常量指針),而不是constchar*(指向常量char的指針)。這個(gè)問(wèn)題很容易解決:typedefconstchar*cpstr; 351. 352. intmystrcmp(cpstr,cpstr);/現(xiàn)在是正確的 353. 354. 記?。翰还苁裁磿r(shí)候,只要為指針聲明typedef,那么都要在最終的typedef名稱(chēng)中加一個(gè)const,以使得該指針本身是常量,而不是對(duì)象。代碼簡(jiǎn)化 355. 356. 上面討論的typedef行為有點(diǎn)像#define宏,用其實(shí)際類(lèi)型替代同義字。不同點(diǎn)是typedef在編譯時(shí)被解釋?zhuān)虼俗尵幾g器來(lái)應(yīng)付超越預(yù)處理
18、器能力的文本替換。例如:typedefint(*PF)(constchar*,constchar*); 357. 358. 這個(gè)聲明引入了PF類(lèi)型作為函數(shù)指針的同義字,該函數(shù)有兩個(gè)constchar*類(lèi)型的參數(shù)以及一個(gè)int類(lèi)型的返回值。如果要使用下列形式的函數(shù)聲明,那么上述這個(gè)typedef是不可或缺的:PFRegister(PFpf); 359. 360. Register()的參數(shù)是一個(gè)PF類(lèi)型的回調(diào)函數(shù),返回某個(gè)函數(shù)的地址,其署名與先前注冊(cè)的名字相同。做一次深呼吸。下面我展示一下如果不用typedef,我們是如何實(shí)現(xiàn)這個(gè)聲明的:int(*Register(int(*pf)(constc
19、har*,constchar*) 361. 362. (constchar*,constchar*); 363. 364. 很少有程序員理解它是什么意思,更不用說(shuō)這種費(fèi)解的代碼所帶來(lái)的出錯(cuò)風(fēng)險(xiǎn)了。顯然,這里使用typedef不是一種特權(quán),而是一種必需。持懷疑態(tài)度的人可能會(huì)問(wèn):OK,有人還會(huì)寫(xiě)這樣的代碼嗎?,快速瀏覽一下揭示signal()函數(shù)的頭文件,一個(gè)有同樣接口的函數(shù)。typedef和存儲(chǔ)類(lèi)關(guān)鍵字(storageclassspecifier) 365. 366. 這種說(shuō)法是不是有點(diǎn)令人驚訝,typedef就像auto,extern,mutable,static,和register一樣,是一
20、個(gè)存儲(chǔ)類(lèi)關(guān)鍵字。這并是說(shuō)typedef會(huì)真正影響對(duì)象的存儲(chǔ)特性;它只是說(shuō)在語(yǔ)句構(gòu)成上,typedef聲明看起來(lái)象static,extern等類(lèi)型的變量聲明。下面將帶到第二個(gè)陷阱:typedefregisterintFAST_COUNTER;/錯(cuò)誤 367. 368. 編譯通不過(guò)。問(wèn)題出在你不能在聲明中有多個(gè)存儲(chǔ)類(lèi)關(guān)鍵字。因?yàn)榉?hào)typedef已經(jīng)占據(jù)了存儲(chǔ)類(lèi)關(guān)鍵字的位置,在typedef聲明中不能用register(或任何其它存儲(chǔ)類(lèi)關(guān)鍵字)。促進(jìn)跨平臺(tái)開(kāi)發(fā) 369. 370. typedef有另外一個(gè)重要的用途,那就是定義機(jī)器無(wú)關(guān)的類(lèi)型,例如,你可以定義一個(gè)叫REAL的浮點(diǎn)類(lèi)型,在目標(biāo)機(jī)器上它
21、可以i獲得最高的精度:typedeflongdoubleREAL; 371. 372. 在不支持longdouble的機(jī)器上,該typedef看起來(lái)會(huì)是下面這樣:typedefdoubleREAL; 373. 374. 并且,在連double都不支持的機(jī)器上,該typedef看起來(lái)會(huì)是這樣:、typedeffloatREAL; 375. 376. 你不用對(duì)源代碼做任何修改,便可以在每一種平臺(tái)上編譯這個(gè)使用REAL類(lèi)型的應(yīng)用程序。唯一要改的是typedef本身。在大多數(shù)情況下,甚至這個(gè)微小的變動(dòng)完全都可以通過(guò)奇妙的條件編譯來(lái)自動(dòng)實(shí)現(xiàn)。不是嗎?標(biāo)準(zhǔn)庫(kù)廣泛地使用typedef來(lái)創(chuàng)建這樣的平臺(tái)無(wú)關(guān)類(lèi)型
22、:size_t,ptrdiff和fpos_t就是其中的例子。此外,象std:string和std:ofstream這樣的typedef還隱藏了長(zhǎng)長(zhǎng)的,難以理解的模板特化語(yǔ)法,例如:basic_stringchar,char_traits,allocator和basic_ofstreamchar,char_traits。 377. 378. 379. 380. 381. 382. typedefdefine的問(wèn)題有下面兩種定義pStr數(shù)據(jù)類(lèi)型的方法,兩者有什么不同?哪一種更好一點(diǎn)?typedefchar*pStr; 383. 384. #definepStrchar*; 385. 386.
23、答案與分析: 387. 388. 通常講,typedef要比#define要好,特別是在有指針的場(chǎng)合。請(qǐng)看例子:typedefchar*pStr1; 389. 390. #definepStr2char*; 391. 392. pStr1s1,s2; 393. 394. pStr2s3,s4; 395. 396. 在上述的變量定義中,s1、s2、s3都被定義為char*,而s4則定義成了char,不是我們所預(yù)期的指針變量,根本原因就在于#define只是簡(jiǎn)單的字符串替換而typedef則是為一個(gè)類(lèi)型起新名字。#define用法例子:#definef(x)x*x 397. 398. main()
24、 399. 400. 401. 402. inta=6,b=2,c; 403. 404. c=f(a)/f(b); 405. 406. printf(%dn,c); 407. 408. 409. 410. 以下程序的輸出結(jié)果是:36。 411. 412. 因?yàn)槿绱嗽?,在許多C語(yǔ)言編程規(guī)范中提到使用#define定義時(shí),如果定義中包含表達(dá)式,必須使用括號(hào),則上述定義應(yīng)該如下定義才對(duì):#definef(x)(x*x)當(dāng)然,如果你使用typedef就沒(méi)有這樣的問(wèn)題。 413. 414. 4.typedefdefine的另一例下面的代碼中編譯器會(huì)報(bào)一個(gè)錯(cuò)誤,你知道是哪個(gè)語(yǔ)句錯(cuò)了嗎? 415. 4
25、16. typedefchar*pStr; 417. 418. charstring4=abc; 419. 420. constchar*p1=string; 421. 422. constpStrp2=string; 423. 424. p1+; 425. 426. p2+; 427. 428. 答案與分析: 429. 430. 是p2+出錯(cuò)了。這個(gè)問(wèn)題再一次提醒我們:typedef和#define不同,它不是簡(jiǎn)單的文本替換。上述代碼中constpStrp2并不等于constchar*p2。constpStrp2和constlongx本質(zhì)上沒(méi)有區(qū)別,都是對(duì)變量進(jìn)行只讀限制,只不過(guò)此處變量p2
26、的數(shù)據(jù)類(lèi)型是我們自己定義的而不是系統(tǒng)固有類(lèi)型而已。因此,constpStrp2的含義是:限定數(shù)據(jù)類(lèi)型為char*的變量p2為只讀,因此p2+錯(cuò)誤。#define與typedef引申談 431. 432. 1)#define宏定義有一個(gè)特別的長(zhǎng)處:可以使用#ifdef,#ifndef等來(lái)進(jìn)行邏輯判斷,還可以使用#undef來(lái)取消定義。 433. 434. 2)typedef也有一個(gè)特別的長(zhǎng)處:它符合范圍規(guī)則,使用typedef定義的變量類(lèi)型其作用范圍限制在所定義的函數(shù)或者文件內(nèi)(取決于此變量定義的位置),而宏定義則沒(méi)有這種特性。 435. 436. 5.typedef&復(fù)雜的變量聲明 437. 438. 在編程實(shí)踐中,尤其是看別人代碼的時(shí)候,常常會(huì)遇到比較復(fù)雜的變量聲明,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國(guó)男士襯衣行業(yè)發(fā)展分析及競(jìng)爭(zhēng)格局與發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 2025至2030中國(guó)生姜產(chǎn)品行業(yè)市場(chǎng)占有率及投資前景評(píng)估規(guī)劃報(bào)告
- 2025至2030中國(guó)甑炭行業(yè)需求動(dòng)態(tài)及發(fā)展前景研究報(bào)告
- 點(diǎn)菜技巧培訓(xùn)
- 新人法律培訓(xùn)
- 商業(yè)成功背后的學(xué)生動(dòng)機(jī)分析
- 校園智慧體育設(shè)施的建設(shè)現(xiàn)狀及挑戰(zhàn)
- 情緒智力在教育心理學(xué)中的核心地位
- 醫(yī)療行業(yè)中的科技應(yīng)用與師資培訓(xùn)模式研究
- 商業(yè)環(huán)境下的教育創(chuàng)新與青少年運(yùn)動(dòng)培訓(xùn)的融合研究
- DB1309T 256-2021 榆三節(jié)葉蜂綜合防治技術(shù)規(guī)程
- 人教版五四制六下地理復(fù)習(xí)提綱詳細(xì)筆記
- 燃?xì)夤こ逃?jì)價(jià)規(guī)則及定額應(yīng)用
- 大氣污染控制工程課程設(shè)計(jì)-某廠酸洗硫酸煙霧治理設(shè)施設(shè)計(jì)
- 人教版小學(xué)三年級(jí)下冊(cè)英語(yǔ)復(fù)習(xí)課件(164頁(yè)P(yáng)PT)
- 300MW單元機(jī)組過(guò)熱汽溫控制系統(tǒng)的設(shè)計(jì)
- (完整版)銷(xiāo)售人員銷(xiāo)售能力測(cè)試及答案解析
- 頂管施工頂管作業(yè)安全技術(shù)交底
- 生物膜(高級(jí)生化課件)
- 上海市城鎮(zhèn)排水管道非開(kāi)挖修復(fù)工程施工質(zhì)量驗(yàn)收規(guī)程試行520
- 橋架、線槽支架重量計(jì)算表
評(píng)論
0/150
提交評(píng)論