




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、C/C+中typedef struct和struct的用法xml 代碼1. 由于對typedef理解不夠,因此從網(wǎng)上摘錄了一些資料,整理如下: 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. 結(jié)構也是一種數(shù)據(jù)類型,可以使用結(jié)構變量,因此,象其它類型的變量一樣,在使用結(jié)構變
2、量時要先對其定義。 15. 16. 定義結(jié)構變量的一般格式為: 17. 18. struct結(jié)構名 19. 20. 21. 22. 類型變量名; 23. 24. 類型變量名; 25. 26. . 27. 28. 結(jié)構變量; 29. 30. 結(jié)構名是結(jié)構的標識符不是變量名。 31. 32. 33. 34. 另一種常用格式為: 35. 36. 1 / 1537. 38. typedefstruct結(jié)構名 39. 40. 41. 42. 類型變量名; 43. 44. 類型變量名; 45. 46. . 47. 48. 結(jié)構別名; 49. 50. 51. 52. 53. 54. 另外注意:在C中,str
3、uct不能包含函數(shù)。在C+中,對struct進行了擴展,可以包含函數(shù)。 55. 56. 57. 58. = 59. 60. 61. 62. 實例1:struct.cpp 63. 64. 65. 66. #include 67. 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.
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;這一行編譯將不能通過.為什么? 113. 114. /因為hello是
5、被定義了的對象實例了. 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語言的關鍵字,作用是為一種數(shù)據(jù)類
6、型定義一個新名字。這里的數(shù)據(jù)類型包括內(nèi)部數(shù)據(jù)類型(int,char等)和自定義的數(shù)據(jù)類型(struct等)。 141. 142. 143. 144. 在編程中使用typedef目的一般有兩個,一個是給變量一個易記且意義明確的新名字,另一個是簡化一些比較復雜的類型聲明。 145. 146. 147. 148. 至于typedef有什么微妙之處,請你接著看下面對幾個問題的具體闡述。 149. 150. 151. 152. 2.typedef&結(jié)構的問題 153. 154. 155. 156. 當用下面的代碼定義一個結(jié)構時,編譯器報了一個錯誤,為什么呢?莫非C語言不允許在結(jié)構中包含指向它自己的指針嗎
7、?請你先猜想一下,然后看下文說明: 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的最簡單使用 177. 178. 179. 180. typedeflongbyte_4; 181. 182. 183. 184. 給已知數(shù)據(jù)類型long起個新名字,叫byte_4。 185. 186. 187. 188. 2
8、、typedef與結(jié)構結(jié)合使用 189. 190. 191. 192. typedefstructtagMyStruct 193. 194. 195. 196. intiNum; 197. 198. longlLength; 199. 200. MyStruct; 201. 202. 203. 204. 這語句實際上完成兩個操作: 205. 206. 207. 208. 1)定義一個新的結(jié)構類型 209. 210. 211. 212. structtagMyStruct 213. 214. 215. 216. intiNum; 217. 218. longlLength; 219. 220.
9、; 221. 222. 223. 224. 分析:tagMyStruct稱為“tag”,即“標簽”,實際上是一個臨時名字,struct關鍵字和tagMyStruct一起,構成了這個結(jié)構類型,不論是否有typedef,這個結(jié)構都存在。 225. 226. 227. 228. 我們可以用structtagMyStructvarName來定義變量,但要注意,使用tagMyStructvarName來定義變量是不對的,因為struct和tagMyStruct合在一起才能表示一個結(jié)構類型。 229. 230. 231. 232. 2)typedef為這個新的結(jié)構起了一個名字,叫MyStruct。 233
10、. 234. 235. 236. typedefstructtagMyStructMyStruct; 237. 238. 239. 240. 因此,MyStruct實際上相當于structtagMyStruct,我們可以使用MyStructvarName來定義變量。 241. 242. 243. 244. 答案與分析 245. 246. 247. 248. C語言當然允許在結(jié)構中包含指向它自己的指針,我們可以在建立鏈表等數(shù)據(jù)結(jié)構的實現(xiàn)上看到無數(shù)這樣的例子,上述代碼的根本問題在于typedef的應用。 249. 250. 251. 252. 根據(jù)我們上面的闡述可以知道:新結(jié)構建立的過程中遇到了p
11、Next域的聲明,類型是pNode,要知道pNode表示的是類型的新名字,那么在類型本身還沒有建立完成的時候,這個類型的新名字也還不存在,也就是說這個時候編譯器根本不認識pNode。 253. 254. 255. 256. 解決這個問題的方法有多種: 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. 注意:在這個例子中,你用typedef給一個還未完全聲明的類型起新名字。C語言編譯器支持這種做法。 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關鍵字的用法 313. 314. Typedef聲明有助于創(chuàng)建平臺無關類型,甚至能隱藏復雜和難以理解的語法。不管怎樣,使用typedef能為代碼帶來意想不到的好處,通過本文你可以學習用typedef避免缺欠,從而使代碼更健壯。 315. 316. typedef聲明,簡稱typedef,為現(xiàn)有類型創(chuàng)建一個新的名字。比如人們常常使用typedef來編寫更美觀和可讀的代碼。所謂美觀,意指typedef能隱藏笨拙的語法構造
14、以及平臺相關的數(shù)據(jù)類型,從而增強可移植性和以及未來的可維護性。本文下面將竭盡全力來揭示typedef強大功能以及如何避免一些常見的陷阱。 317. 318. 如何創(chuàng)建平臺無關的數(shù)據(jù)類型,隱藏笨拙且難以理解的語法? 319. 320. 321. 322. 使用typedefs為現(xiàn)有類型創(chuàng)建同義字。定義易于記憶的類型名 323. 324. typedef使用最多的地方是創(chuàng)建易于記憶的類型名,用它來歸檔程序員的意圖。類型出現(xiàn)在所聲明的變量名字中,位于typedef關鍵字右邊。例如:typedefintsize; 325. 326. 此聲明定義了一個int的同義字,名字為size。注意typedef并
15、不創(chuàng)建新的類型。它僅僅為現(xiàn)有類型添加一個同義字。你可以在任何需要int的上下文中使用size:voidmeasure(size*psz); 327. 328. sizearray4; 329. 330. sizelen=file.getlength(); 331. 332. std:vectorvs; 333. 334. typedef還可以掩飾符合類型,如指針和數(shù)組。例如,你不用象下面這樣重復定義有81個字符元素的數(shù)組:charline81; 335. 336. chartext81; 337. 338. 定義一個typedef,每當要用到相同類型和大小的數(shù)組時,可以這樣:typedefch
16、arLine81; 339. 340. Linetext,secondline; 341. 342. getline(text); 343. 344. 同樣,可以象下面這樣隱藏指針語法:typedefchar*pstr; 345. 346. intmystrcmp(pstr,pstr); 347. 348. 這里將帶我們到達第一個typedef陷阱。標準函數(shù)strcmp()有兩個constchar*類型的參數(shù)。因此,它可能會誤導人們象下面這樣聲明mystrcmp():intmystrcmp(constpstr,constpstr); 349. 350. 這是錯誤的,按照順序,constpstr
17、被解釋為char*const(一個指向char的常量指針),而不是constchar*(指向常量char的指針)。這個問題很容易解決:typedefconstchar*cpstr; 351. 352. intmystrcmp(cpstr,cpstr);/現(xiàn)在是正確的 353. 354. 記住:不管什么時候,只要為指針聲明typedef,那么都要在最終的typedef名稱中加一個const,以使得該指針本身是常量,而不是對象。代碼簡化 355. 356. 上面討論的typedef行為有點像#define宏,用其實際類型替代同義字。不同點是typedef在編譯時被解釋,因此讓編譯器來應付超越預處理
18、器能力的文本替換。例如:typedefint(*PF)(constchar*,constchar*); 357. 358. 這個聲明引入了PF類型作為函數(shù)指針的同義字,該函數(shù)有兩個constchar*類型的參數(shù)以及一個int類型的返回值。如果要使用下列形式的函數(shù)聲明,那么上述這個typedef是不可或缺的:PFRegister(PFpf); 359. 360. Register()的參數(shù)是一個PF類型的回調(diào)函數(shù),返回某個函數(shù)的地址,其署名與先前注冊的名字相同。做一次深呼吸。下面我展示一下如果不用typedef,我們是如何實現(xiàn)這個聲明的:int(*Register(int(*pf)(constc
19、har*,constchar*) 361. 362. (constchar*,constchar*); 363. 364. 很少有程序員理解它是什么意思,更不用說這種費解的代碼所帶來的出錯風險了。顯然,這里使用typedef不是一種特權,而是一種必需。持懷疑態(tài)度的人可能會問:OK,有人還會寫這樣的代碼嗎?,快速瀏覽一下揭示signal()函數(shù)的頭文件,一個有同樣接口的函數(shù)。typedef和存儲類關鍵字(storageclassspecifier) 365. 366. 這種說法是不是有點令人驚訝,typedef就像auto,extern,mutable,static,和register一樣,是一
20、個存儲類關鍵字。這并是說typedef會真正影響對象的存儲特性;它只是說在語句構成上,typedef聲明看起來象static,extern等類型的變量聲明。下面將帶到第二個陷阱:typedefregisterintFAST_COUNTER;/錯誤 367. 368. 編譯通不過。問題出在你不能在聲明中有多個存儲類關鍵字。因為符號typedef已經(jīng)占據(jù)了存儲類關鍵字的位置,在typedef聲明中不能用register(或任何其它存儲類關鍵字)。促進跨平臺開發(fā) 369. 370. typedef有另外一個重要的用途,那就是定義機器無關的類型,例如,你可以定義一個叫REAL的浮點類型,在目標機器上它
21、可以i獲得最高的精度:typedeflongdoubleREAL; 371. 372. 在不支持longdouble的機器上,該typedef看起來會是下面這樣:typedefdoubleREAL; 373. 374. 并且,在連double都不支持的機器上,該typedef看起來會是這樣:、typedeffloatREAL; 375. 376. 你不用對源代碼做任何修改,便可以在每一種平臺上編譯這個使用REAL類型的應用程序。唯一要改的是typedef本身。在大多數(shù)情況下,甚至這個微小的變動完全都可以通過奇妙的條件編譯來自動實現(xiàn)。不是嗎?標準庫廣泛地使用typedef來創(chuàng)建這樣的平臺無關類型
22、:size_t,ptrdiff和fpos_t就是其中的例子。此外,象std:string和std:ofstream這樣的typedef還隱藏了長長的,難以理解的模板特化語法,例如:basic_stringchar,char_traits,allocator和basic_ofstreamchar,char_traits。 377. 378. 379. 380. 381. 382. typedefdefine的問題有下面兩種定義pStr數(shù)據(jù)類型的方法,兩者有什么不同?哪一種更好一點?typedefchar*pStr; 383. 384. #definepStrchar*; 385. 386.
23、答案與分析: 387. 388. 通常講,typedef要比#define要好,特別是在有指針的場合。請看例子:typedefchar*pStr1; 389. 390. #definepStr2char*; 391. 392. pStr1s1,s2; 393. 394. pStr2s3,s4; 395. 396. 在上述的變量定義中,s1、s2、s3都被定義為char*,而s4則定義成了char,不是我們所預期的指針變量,根本原因就在于#define只是簡單的字符串替換而typedef則是為一個類型起新名字。#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. 因為如此原因,在許多C語言編程規(guī)范中提到使用#define定義時,如果定義中包含表達式,必須使用括號,則上述定義應該如下定義才對:#definef(x)(x*x)當然,如果你使用typedef就沒有這樣的問題。 413. 414. 4.typedefdefine的另一例下面的代碼中編譯器會報一個錯誤,你知道是哪個語句錯了嗎? 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+出錯了。這個問題再一次提醒我們:typedef和#define不同,它不是簡單的文本替換。上述代碼中constpStrp2并不等于constchar*p2。constpStrp2和constlongx本質(zhì)上沒有區(qū)別,都是對變量進行只讀限制,只不過此處變量p2
26、的數(shù)據(jù)類型是我們自己定義的而不是系統(tǒng)固有類型而已。因此,constpStrp2的含義是:限定數(shù)據(jù)類型為char*的變量p2為只讀,因此p2+錯誤。#define與typedef引申談 431. 432. 1)#define宏定義有一個特別的長處:可以使用#ifdef,#ifndef等來進行邏輯判斷,還可以使用#undef來取消定義。 433. 434. 2)typedef也有一個特別的長處:它符合范圍規(guī)則,使用typedef定義的變量類型其作用范圍限制在所定義的函數(shù)或者文件內(nèi)(取決于此變量定義的位置),而宏定義則沒有這種特性。 435. 436. 5.typedef&復雜的變量聲明 437. 438. 在編程實踐中,尤其是看別人代碼的時候,常常會遇到比較復雜的變量聲明,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小區(qū)變廢為寶活動方案
- 家園溝通活動方案
- 家族文化慶典活動方案
- 安心健康活動方案
- 小商品大學問活動方案
- 尋找漢服大使活動方案
- 小學作文賣書活動方案
- 室內(nèi)團建破冰活動方案
- 安排部署活動方案
- 室內(nèi)搞笑活動方案
- 2024-2025學年下學期高一化學蘇教版期末必刷??碱}之原電池與電解池
- 公司系統(tǒng)主數(shù)據(jù)管理制度
- 2025年煙臺市中考地理試卷真題(含答案及解析)
- 工廠安全手冊從火災到其他事故的應急響應
- 肯德基服務管理制度
- 2025至2030中國微晶玻璃行業(yè)產(chǎn)業(yè)運行態(tài)勢及投資規(guī)劃深度研究報告
- 部編版二年級語文下冊期末測試卷(含答案)
- 2025年甘肅省高考化學試卷真題(含答案解析)
- 公安院校公安專業(yè)招生考生患病經(jīng)歷申報表
- 市政工程-綜合管廊工程策劃質(zhì)量方案編制指導手冊 2025
- 自考本科日語試題及答案
評論
0/150
提交評論