2012-12-02 122 views
2

爲什麼我在Visual C++中嘗試這個時會出錯?爲什麼我要重新定義;不同的基本類型?

struct S { }; 
typedef S *S; 

不是C++ let you typedef a name that was previously only declared as a class or struct
還是我誤解發生了什麼?

+0

這將在C語言中,但不允許在C++。在C++中,'struct S {...};'大致等同於'typedef struct S {...} S;'在C中(即之後,您可以用'S x定義一個'S'的實例;',不需要'struct S x;'。 –

回答

5

C++確實允許您鍵入一個現有的類名,但只能以非常有限的方式。一旦你宣佈你struct S你可以做

typedef struct S S; 

,但你不能做

typedef struct S *S; // ERROR 

typedef int S; // ERROR 

在第一種情況下,你正在重新定義S指針事實是什麼打破它。

語言規範說,在7.1.3/2

在給定的非類範圍,一個typedef說明符可以用來重新定義 在該範圍來指代聲明的任何類型的名稱它已經提到的 類型。

「已引用」是關鍵部分。簡而言之,你可以重新定義一個類名來代表相同的類的類型,但不能代表指針到類的類型或其他。


的C++標準,上述部分也是什麼讓你寫重複的typedef像

typedef int T; 
typedef int T; 
typedef int T; 

這將在C.是非法

+0

哦,所有它允許的是一個冗餘的聲明......有趣的,謝謝+1 – Mehrdad

+1

@Mehrdad請注意,在C2011中允許重複相同的typedef 6.7(3) :「一個typedef名稱可能被重新定義爲表示與當前相同的類型,只要該類型不是可變修改類型;」(除了可變修改類型)。 –

0

您正試圖定義與「S」(結構名稱)衝突的S(typedef)。

1

這在C中是可以的,因爲結構體名稱不會與類型名稱衝突 - 結構體名稱將是struct S,而類型名稱只是S。但是,在C++中,所有名稱都被認爲來自同一個名稱池,所以在您的示例中這兩個名稱會發生​​衝突。

相關問題