![](/img/trans.png)
[英]Is there any way to use type-punning in the c-union-style with c++?
[英]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;
但我經常看到代碼樣式如下:
typedef struct tagMyStruct {...} MyStruct;
typedef struct _MyStruct {...} MyStruct;
<是的,我知道下划線+大寫字母 在每種情況下,有人在某種程度上使標簽名稱與類型名稱不同 。 它背后有任何實際原因嗎?
旁注:我使用的是C ++編譯器,但我想與這些定義C兼容(我知道這對c ++來說是不好的風格)。 出於維護某些調試工具的可用性的原因,我需要所有標記名稱都是有意義的(不是自動生成的__unknown_something標記,如果是未命名的結構,您可以,例如,在visual studio類視圖中查看)。
同樣的問題/問題適用於工會和枚舉。
語言方面,在C和C ++中完全沒問題,因為標簽名稱存在於單獨的名稱空間(而不是namespace
)中。
在C ++中,使用typedef
絕對是不好的風格,因為它是多余的。 無論是否具有typedef
都可以使用MyStruct
和struct 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.