2011-12-24 58 views
37

C11支持匿名結構,如下所示:爲什麼C++ 11不支持匿名結構,而C11呢?

struct Foo 
{ 
    struct 
    { 
     size_t x, y; 
    }; 
}; 
struct Foo f; 
f.x = 17; 
f.y = 42; 

基本上,這樣的struct的成員就好像它們是成員處理的包圍structunion(遞歸,如果封閉結構本身就是匿名)。

什麼是對C++ 11不是也包括匿名結構的合理性?他們只是不尋常的有用(主要是內部的工會,以消除對struct標識符的打字),肯定。但他們似乎明顯不足除了規範(並已被許多編譯器實現的一個)當然,他們必須已討論,至少是保持與C11標準的兼容性。那麼他們爲什麼不添加?

+12

我不同意投票,這個問題是沒有建設性。較軟的問題也很好。 – GManNickG 2011-12-24 03:44:29

+6

__Practically speaking__大多數C++ 11編譯器也支持匿名結構。我已經在MSVC++(從前)和Apple的llvm C++ 11編譯器中使用過它們。 – bobobobo 2012-10-15 19:17:17

+0

MinGW也支持匿名結構/聯合。 – 2015-02-14 05:18:24

回答

42

舉手之勞已作出維持℃之間++和C這兩種語言演變的兼容性。請注意,可變長度堆棧數組自1999年以來一直在C中,但未包含在C++ 11中。雖然他們通常不會引入互相矛盾的事情,但C++委員會並沒有完全反思,以確保C++ 11與C89之外的C版本兼容。

此外,該功能會在C++中相當複雜,因爲struct只不過是一個class多。而一個匿名結構/類應該具有常規結構/類的所有功能,是的?否則,擁有它有什麼意義?

會是什麼意思構建一個無名struct?你將如何定義構造函數?有些事情是如此簡單:

struct Foo 
{ 
    struct 
    { 
     size_t &x; 
    }; 
}; 

是根本不可能的,因爲內struct沒有構造函數。而且沒有辦法指定一個。 A struct不能構建其中另一個struct的成員。

這樣的事情:

struct Foo 
{ 
    size_t outer; 
    struct 
    { 
     void SomeFunc(); 
     size_t x; 
    }; 
}; 

什麼this指針呢SomeFunc得到什麼? this的類型是什麼,無名和無名類型?你甚至可以在結構外定義SomeFunc?的SomeFunc名稱不能是Foo::SomeFunc,因爲SomeFunc生活在內部範圍。

這對C++來說太複雜了。當然沒有足夠的價值來添加複雜性。

+14

這是合理的,儘管我可以想象限制會使它完全合理:POD,沒有方法(繼承或其他方式),以及我認爲完全公開的解決您提出的問題。在我看來,匿名工會已經引入了很多這樣的問題,所以這些問題對我來說似乎並不「太複雜」,除非解決問題的動力太小。 – 2011-12-24 04:16:53

+11

「構建一個無名結構意味着什麼?你將如何定義構造函數?」。同樣的事情可以要求一個無名的工會。工會也可以有建設者。 – 2011-12-24 14:09:18

+0

此外,您從C11中獲得的大部分匿名結構也可以從繼承中獲得。匿名工會會更有用,但是正如尼科爾指出的那樣,整個功能對C++來說並不合適。 – 2012-01-31 17:15:06

3

要唱唱反調 - class和struct聲明,不經常使用包裝類特定的類型聲明。

typedef struct { 

} name; 

因此應該是允許的。

因此

struct { 

} 

應爲好。

然而,如果我們認爲這只是一個類的內部命名空間內聲明,就沒有辦法訪問結構的內部。

由於結構!=命名空間中的C,C可以彌補規則,想通過周圍結構訪問匿名結構。

對於C++允許這樣就需要特殊的情況下,這種情況下,這將名稱解析複雜化。

當然,打魔鬼的魔鬼代言人 - ç實際上這樣做。它爲命名解析添加了額外的級別 - 如果在stuct中找不到名稱,請檢查struct的匿名成員。這有點神奇,我可以看到C++委員會成員覺得煩人。

它也提出了一些問題 - 如果匿名結構可以通過它的父類進行訪問,怎麼樣在一個命名空間匿名結構。

當然,如果你真的想知道,只是問斯特勞斯 - 他迴應電子郵件。

+0

這不可能是正確的原因---匿名工會*被支持(即使在C++ 98!),但匿名結構不是?如果這是原因,那麼不應該支持匿名聯合,因爲它們與結構共享相同的名稱空間。 – 2015-09-30 18:02:25

+0

我覺得這個「有點神奇」有趣。對我來說更像是「這不是我們決定的,neener-neener」。 – 6502 2016-01-09 07:50:57

+0

C++已經支持內容溢出的匿名聯合和匿名命名空間,就好像它們是在外部作用域內聲明的一樣。匿名結構完成這個三重奏(在圖形編程中特別有用)。另一方面,C++ 11甚至超越C並支持內聯命名空間(即使命名時,不僅僅是匿名)。 http://stackoverflow.com/questions/11016220/what-are-inline-namespaces-for – 2016-02-10 05:22:28

-2

它認爲這個工作在C++ 11

struct A 
{ 
    int someVariable; 
}; 

struct B : public A 
{ 
    int someOtherVariable; 
}; 

使用它作爲:

B structB; 
structB.someVariable = 5; 
structB.someOtherVariable = 6; 

幫我解決了類似的問題。