關於在傳統C中經常看到的tagXX的若干解釋(轉載)

tagXX是結構體的【本名】,XX是【別名】,無論本名和別名都不是必要的,你甚至可以兩個都不要,所以不能說“要寫兩個名稱”,你應該問“爲什麼可以有兩個名稱”,“兩個名稱有什麼區別”。

傳統C語言中,定義結構體的標準語法是:
  • struct tagXX
  • {
  • };
tagXX是這個結構體的【本名】。你使用本名定義一個結構體的實例時,必須加上struct:
  • struct tagXX a;
下面的代碼是錯誤的(在傳統C語言中):
  • tagXX a; /* 編譯錯誤!定義結構的實例時必須用struct關鍵字 */

typedef作用是給類創建一個【別名】,下面是你給的代碼:
  • typedef struct tagXX
  • {
  • } XX;
其實這段代碼相當於:
  • struct tagXX
  • {
  • };
  • typedef struct tagXX XX;
這裏面,tagXX是這個結構體的本名,XX只是struct tagXX的別名。
然後你可以用XX來定義變量:
  • XX a; /*相當於struct tagXX a; */
這樣代碼更簡潔了。

實際上定義結構體時使用typedef的話,完全可以在創建別名的同時不給結構體命名:
  • typedef struct
  • {
  • } XX;
  • XX a;
這裏,結構體沒有了“本名”,剩下XX這個別名,同樣可以使用"XX a; "來定義實例。

你甚至可以本名和別名都不要,直接用結構體定義一個實例:
  • struct
  • {
  • } a;

【C++】
C++裏,用結構定義實例已經不需要struct關鍵字,例如:
  • struct tagXX {};
  • tagXX a; //C++裏沒有問題
  • struct tagXX b; //兼容C,也沒有問題

所以,在C++裏定義結構體的同時已經不再需要用typedef創建別名。
發佈了22 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章