2011-01-07 57 views

回答

12

一個無名union一個struct內很有意義,因爲它可以讓你指的是工會成員,而不指定它的名字,因此短代碼:

struct { 
    int a; 

    union { 
    int b, c, d; 
    }; 
} foo; 

所以訪問的union的成員就像訪問包含結構的成員:foo.afoo.b。否則,您必須使用foo.union_name.b才能訪問工會會員。

當然,使用這種結構的「用戶」程序員應該知道設置foo.c會影響foo.bfoo.d的值。

出於同樣的原因,相反可以做的,就是把一個匿名struct一個union內:

union { 
    struct { 
    int a, b; 
    }; 

    int c; 
} foo; 

這樣foo.afoo.b可以同時使用和foo.c可以在其他情況下使用。

我不能想到匿名結構或聯合的任何其他用途。 「聲明」匿名結構/聯合是一種矛盾,就像是說int;而不是int a;

+0

這真的很好,我不知道。你爲我節省了很多擊鍵! – GWW 2011-01-07 15:09:21

0

在這種情況下,您將結構(包含4個字節)和無符號整數(也是4個字節)映射到相同的內存位置。

+0

我想你錯過了一點:OP知道工會是爲了什麼,他只是問工會內的無名結構。 – ereOn 2011-01-07 14:56:28

+0

閱讀標題「你可能會用什麼名字的結構或聯盟?」我不認爲我錯過了整個觀點。但是,當我重讀它時,問題的最後一部分暗示了結構。 – 2011-01-07 15:07:59

1

您可以使用結構或類中的匿名結構對某些舊數據的值進行分組,以簡化實例的初始化(使用memset),但無法執行此操作,因爲該類是從另一個派生的。

例:

#include <string.h> 
class Base 
{ 
private: 
    int field1; 
    int field2; 

public: 
    Base() 
    { 
     // initialize field1, field2 
    } 

    virtual void DoSomething(); 
}; 

class Derived : public Base 
{ 
private: 
    struct 
    { 
     int field2; 
     int field3; 
     int field4; 
     // ... 
     int field99; 
    } data; 

public: 
    Derived() 
    : Base() 
    { 
     memset(&data, 0, sizeof(data)); 

     // if you didn't group those value in an anonymous struct 
     // you would have to do something like that (not safe): 
     // memset(sizeof(Base) + (char*)this, 0, sizeof(Derived) - sizeof(Base)); 
    } 
}; 

注意,存在更好的選擇(使用一個std ::向量或INT在我的例子[99])。但它有時可能有用。

+0

+1。這是一個很好的例子,當正確的答案沒有任何投票,沒有回答問題的帖子有6票 – 2011-01-07 15:50:44

5

這主要是因爲struct和union非常相似。一般來說,只有在工會內部有匿名結構,在結構內部有匿名工會,但在工會內的結構或工會中嵌套結構大體上等同於直接列出其成員。

請注意,不應使用工會轉換值,因爲絕對沒有佈局保證。

相關問題