2012-05-09 42 views
3

我工作的一些代碼,碰上這樣的事:無名結構/聯合爲類私有成員

class Foo 
{ 
private: 
    union { 
    byte bar; 
    struct { 
     byte baz1; 
     byte baz2; 
    }; 
    }; 
}; 

現在,我與警告級別4編譯VS 2010下(純非託管)和當然VS抱怨說,無名結構/聯合是一個非標準的擴展(警告C4201),我想修復這個警告。

沒有任何理由可言有人寧願上面:

class Foo 
{ 
private: 
    byte bar; 
    byte baz1; 
    byte baz2; 
}; 

或者任何理由改變前者向後者將打破?

+5

建議的修復程序的內存佈局完全不同。 – ildjarn

回答

1

我相信你已經知道這一點 - 如果使用了一個工會 內存存儲是由工會成員共享的。 第二個示例將爲所有項目 分配單獨的存儲空間,但第一個示例不會(在bar和匿名結構體 之間共享)。

無名結構/一般不建議工會 看到這個網址:

Why does C++ disallow anonymous structs and unions?

我可以看到變化的例子2:1個斷裂,但除非你是取決於不是1〜2破 事實上,存儲共享 聯盟(這是一個非常糟糕的做法)..

0

確定有一個原因。您的解決方案需要使用聯合版本50%的內存空間。此外,與工會,foo.bar = foo.baz1所有Foo foo;

1

將編譯器警告級別設置爲4將發出此警告。

是的,有人會推薦unionstruct。這兩個數據結構非常不同。我不會在這裏找到或反對union的原因,因爲這超出了範圍,但是here's是一個鏈接。

如果你想保留的工會,你也許可以做到這一點:

class Foo 
{ 
private: 
    union { 
    int bar; 
    struct { 
     int baz1; 
     int baz2; 
    } thing_; 
    }; 
}; 

注意Foo現在有一個名爲unionthing_成員。