簡體   English   中英

C樣式/ C ++正確性,是struct / union / enum標簽與類型名稱相同嗎?

[英]C style/C++ correctness, is struct/union/enum tag same as type name bad in any way?

以下MyStruct(標記MyStruct)的定義和MyStruct類型的類型定義似乎完全可以通過gcc(至少4.6.2)和g ++來完成。

typedef struct MyStruct {
  int a;
  int b;
} MyStruct;

我的問題是:它是否容易出錯(在C和/或C ++中)或使用標簽名稱與類型名稱相同的錯誤樣式?

根據http://www.eetimes.com/discussion/programming-pointers/4024450/Tag-vs-Type-Names,它不是:

我永遠不明白為什么他們為標簽和typedef使用不同的名稱,當一個名稱做得很好時:

 typedef struct tree_node tree_node; 

但我經常看到代碼樣式如下:

  1. typedef struct tagMyStruct {...} MyStruct;
  2. typedef struct myStruct {...} MyStruct;`
  3. typedef struct _MyStruct {...} MyStruct; <是的,我知道下划線+大寫字母

在每種情況下,有人在某種程度上使標簽名稱類型名稱不同 它背后有任何實際原因嗎?

旁注:我使用的是C ++編譯器,但我想與這些定義C兼容(我知道這對c ++來說是不好的風格)。 出於維護某些調試工具的可用性的原因,我需要所有標記名稱都是有意義的(不是自動生成的__unknown_something標記,如果是未命名的結構,您可以,例如,在visual studio類視圖中查看)。

同樣的問題/問題適用於工會和枚舉。

語言方面,在C和C ++中完全沒問題,因為標簽名稱存在於單獨的名稱空間(而不是namespace )中。

在C ++中,使用typedef絕對是不好的風格,因為它是多余的。 無論是否具有typedef都可以使用MyStructstruct MyStruct

如果您認為C兼容性比C ++樣式更重要,那么這是您的選擇。 :-)

因為C(可以)實現了單程編譯器,所以在未創建時自引用typedef是一個錯誤。 例如,這是無效的,

typedef struct {
  Foo *next;
  int i;
} Foo;

從而,

typedef struct tagFoo {
  struct tagFoo *next;
  int i;
} Foo;

當你想把它稱為Foo而不是struct Foo 請參閱為什么我們應該在C中經常輸入構造結構? 討論。

'struct Foo'在不同的命名空間中聲明struct。 所以,'struct Foo'和'Foo'不能干涉。

typedef struct _foo {} foo; 對我來說不是很清楚。 也許它是指針的殘留( typedef struct _foo {} foo, *Pfoo; )typedefing。

從技術上講,沒有理由說名稱需要不同,並且為兩個標識符使用相同的名稱編寫了大量代碼。 重要的是要在自己的代碼中保持一致。

可以說,過度使用typedef污染命名空間,這可能是真的。 我使用的經驗法則是:如果我要使用它很多,請使用typedef ,如果不是的話。

另外,如果我使用的是typedef我沒有命名struct ,所以我會像這樣編碼:

typedef struct {
    int a;
    int b;
} struct_t;

這樣我就必須始終如一地使用它,一致性是良好編碼風格的關鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM