爲什麼我在Visual C++中嘗試這個時會出錯?爲什麼我要重新定義;不同的基本類型?
struct S { };
typedef S *S;
不是C++ let you typedef
a name that was previously only declared as a class
or struct
?
還是我誤解發生了什麼?
爲什麼我在Visual C++中嘗試這個時會出錯?爲什麼我要重新定義;不同的基本類型?
struct S { };
typedef S *S;
不是C++ let you typedef
a name that was previously only declared as a class
or struct
?
還是我誤解發生了什麼?
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.是非法
哦,所有它允許的是一個冗餘的聲明......有趣的,謝謝+1 – Mehrdad
@Mehrdad請注意,在C2011中允許重複相同的typedef 6.7(3) :「一個typedef名稱可能被重新定義爲表示與當前相同的類型,只要該類型不是可變修改類型;」(除了可變修改類型)。 –
您正試圖定義與「S」(結構名稱)衝突的S(typedef)。
這在C中是可以的,因爲結構體名稱不會與類型名稱衝突 - 結構體名稱將是struct S
,而類型名稱只是S
。但是,在C++中,所有名稱都被認爲來自同一個名稱池,所以在您的示例中這兩個名稱會發生衝突。
這將在C語言中,但不允許在C++。在C++中,'struct S {...};'大致等同於'typedef struct S {...} S;'在C中(即之後,您可以用'S x定義一個'S'的實例;',不需要'struct S x;'。 –