[英]Purpose of struct, typedef struct, in C++
在C ++中,可以創建一個結構:
struct MyStruct
{
...
}
並且還可以執行以下操作:
typedef struct
{
...
} MyStruct;
然而就我所知,兩者之間沒有可辨別的區別。 哪個更好? 如果沒有差異,為什么兩種方式都存在? 在風格或可讀性上,一個比另一個好嗎?
以下是兩個聲明/定義之間的差異:
1)您不能使用typedef名稱來標識構造函數或析構函數
struct MyStruct { MyStruct(); ~MyStruct(); }; // ok
typedef struct { MyStructTD(); ~MyStructTD(); } MyStructTD; // not ok
// now consider
typedef struct MyStruct2 { MyStruct2(); } MyStructTD2; // ok
MyStructTD2::MyStruct2() { } // ok
MyStructTD2::MyStructTD2() { } // not ok
2)您不能隱藏typedef名稱,就像您可以通過類頭引入名稱一樣 - 或者相反,如果您已經有一個函數或具有特定名稱的對象,您仍然可以使用類頭來聲明具有該名稱的類但不是通過typedef方法。
struct MyStruct { }; // ok
typedef struct { } MyStructTD; // ok
void MyStruct() { } // (1) - ok Hides struct MyStruct
void MyStructTD() { } // (2) - not-ok - ill-formed
//> Or if you flip it around, consider in a new translation unit:
void MyStruct() { } // ok
void MyStructTD() { } // ok
struct MyStruct { }; // ok
typedef struct { } MyStructTD; // Not ok
3)您不能在詳細的類型說明符中使用typedef名稱
struct MyStruct { }; // ok
typedef struct { } MyStructTD; // ok
int main()
{
void MyStruct();
void MyStructTD(); // ok - new declarative region
struct MyStruct ms; // ok - names the type
struct MyStructTD ms2; // not ok - cannot use typedef-name here
}
struct AnotherStruct
{
friend struct MyStruct; // ok
friend struct MyStructTD; // not ok
};
4)您不能使用它來定義嵌套結構
struct S { struct M; };
typedef struct { } S::M; // not ok
struct S::M { }; // ok
如您所見,兩者之間存在明顯的差異。 typedef的一些怪癖是C兼容性的結果(這主要是為什么我認為兩種方式存在) - 並且在大多數情況下,在類頭中聲明名稱是更自然的C ++ - 它有其優點(特別是當你需要定義構造函數和析構函數),因此是優選的。 如果您正在編寫需要與C和C ++兼容的代碼,那么使用這兩種方法都會帶來好處。 但是如果你正在編寫純C ++,我發現在class-head中指定類名更具可讀性。
typedef版本是一個特例
typedef foo bar;
它定義了一個新的“類型”欄作為foo的別名。 在你的情況下,foo恰好是一個結構。 在C中,這是引入新“類型”的唯一方法(在引號中,因為它們實際上並不等同於int,float和co)。 在C ++中,這不是那么有用,因為C ++旨在使新類型的定義比C更容易和更完整(至少在C ++的開頭),並且甚至不需要typedef來引用先前聲明的struct(或類)。
后者與C兼容 - 使用新C ++代碼中的第一個。
您將使用typedef,因此在聲明該結構的變量時不需要指定struct關鍵字。
沒有typedef:
struct MyStruct foo;
使用typedef:
MyStruct foo;
基本上你正在使MyStruct顯示為一個新類型,因此它也實現了某種程度的類型抽象,因為程序員不需要明確知道它是什么類型。 您可以將MyStruct傳遞給函數,操作其中的數據並將其返回,程序員無需擔心實際發生的情況。
由於這個原因,大多數C標准庫都使用typedef。
“struct MyStruct {};” 構造隱式定義了等效的typedef,因此通常這是首選的現代用法。 對於typedef仍然有一些用途,主要是指向結構的指針類型。 例如
typedef struct MyStruct* MyStructPtr;
有許多答案認為兩種方法都是等價的,但事實並非如此。
typedef
關鍵字用於創建類型別名,也就是說,它提供了一種引用另一種類型的新方法。 當你使用typedef struct {} XXX;
您實際上是在創建一個未命名的類型,然后為該未命名的類型創建一個別名XXX 。 另一方面,當您鍵入struct XXX {}
。
請在這里閱讀Michael Burr的答案(這是一個比該問題所接受的答案更好的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.