簡體   English   中英

struct,typedef struct的目的,在C ++中

[英]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.

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