2009-07-05 143 views
15

在C++中,它可以創建一個結構:用途結構,typedef結構,在C++的

struct MyStruct 
{ 
    ... 
} 

而且還可以做到以下幾點:

typedef struct 
{ 
    ... 
} MyStruct; 

然而,據我可以說,兩者之間沒有明顯的區別。哪個更好?爲什麼兩種方式都存在,如果沒有區別?在風格或可讀性方面比其他人更好嗎?

+2

這是http://stackoverflow.com/questions/612328/difference-between的副本-struct-and-typedef-struct-in-c,但我不打算投票結束,因爲這個問題的接受答案是(微妙)錯誤的,正如在第二次投票答案中所解釋的那樣... – 2009-07-05 12:27:24

回答

12

的typedef的版本是

typedef foo bar; 

其中定義了一個新的「類型」欄中作爲foo的別名的特殊情況。在你的情況下,foo碰巧是一個結構。在C語言中,這是引入新「類型」的唯一方法(在引號中,因爲它們並不等同於int,float和co)。在C++中,這不是很有用,因爲C++被設計爲使得新類型的定義比C更容易和更完整(至少在C++的開頭),並且typedef甚至不必引用先前聲明的結構(或類)。

2

您將使用typedef,因此在聲明該結構體的變量時不需要指定struct關鍵字。

沒有的typedef:

struct MyStruct foo; 

用typedef:

MyStruct foo; 

基本上你正在MYSTRUCT出現一個新的類型,因此它也實現了某種抽象級別的程序員不需要知道明確它是什麼類型。您可以將MyStruct傳遞給一個函數,處理它中的數據並返回它,程序員不需要擔心實際發生的事情。

很多C標準庫都使用typedef。

+0

so its只是少打字? – darkrain 2009-07-05 12:17:32

+5

不需要C++中的'struct'關鍵字,只有C – 2009-07-05 12:17:53

+0

對不起,總是在C程序員涉及C++問題時發生:(但是你在我完成編輯之前就已經找到了答案:)在這個中 – Cromulent 2009-07-05 12:19:42

7

後者與C兼容 - 在新的C++代碼中使用第一個。

0

「struct MyStruct {};」構造隱含地定義了等效的typedef,因此通常這將是現代用法的首選。 typedef仍然有一些用途,主要是指向結構的指針類型。例如。

typedef struct MyStruct* MyStructPtr; 
22

這裏有兩個聲明/定義之間的差異:


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)不能在一個詳細類型說明符

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)不能使用它來定義嵌套使用typedef名結構

struct S { struct M; }; 

typedef struct { } S::M; // not ok 

struct S::M { }; // ok 

正如您所看到的,兩者之間存在明顯的差異。一些typedef的怪癖是C兼容性的結果(這主要是爲什麼我認爲這兩種方式都存在) - 在大多數情況下,在類頭中聲明名稱更自然C++ - 它有它的優勢(特別是當你需要定義構造函數和析構函數),因此更可取。如果您正在編寫需要兼容C和C++的代碼,那麼使用這兩種方法都有好處。但是如果你正在編寫純粹的C++,我發現在類頭中指定類名是更可讀的。

1

有很多答案認爲這兩種方法是等價的,但它們不是。

typedef關鍵字用於創建一個類型別名,也就是說,它提供了一種引用另一種類型的新方法。當您使用typedef struct {} XXX;時,您實際上正在創建一個未命名類型,然後爲該未命名類型創建一個別名XXX。另一方面,當你輸入struct XXX {}

請,由邁克爾·伯爾here(這是一個比接受了這個問題一個更好的答案讀出了答案。