我可以看到你可能使用什麼名稱的結構或聯合?
union {
uint32_t ip_address
struct {
uint8_t oct1;
uint8_t oct2;
uint8_t oct3;
uint8_t oct4;
};
};
可能是一些使用的人,但在結構這裏結構例子: Detail of MS warning C4201似乎有點奇怪。任何人都可以展示一個很好的用例嗎
我可以看到你可能使用什麼名稱的結構或聯合?
union {
uint32_t ip_address
struct {
uint8_t oct1;
uint8_t oct2;
uint8_t oct3;
uint8_t oct4;
};
};
可能是一些使用的人,但在結構這裏結構例子: Detail of MS warning C4201似乎有點奇怪。任何人都可以展示一個很好的用例嗎
一個無名union
一個struct
內很有意義,因爲它可以讓你指的是工會成員,而不指定它的名字,因此短代碼:
struct {
int a;
union {
int b, c, d;
};
} foo;
所以訪問的union
的成員就像訪問包含結構的成員:foo.a
和foo.b
。否則,您必須使用foo.union_name.b
才能訪問工會會員。
當然,使用這種結構的「用戶」程序員應該知道設置foo.c
會影響foo.b
和foo.d
的值。
出於同樣的原因,相反可以做的,就是把一個匿名struct
一個union
內:
union {
struct {
int a, b;
};
int c;
} foo;
這樣foo.a
和foo.b
可以同時使用和foo.c
可以在其他情況下使用。
我不能想到匿名結構或聯合的任何其他用途。 「聲明」匿名結構/聯合是一種矛盾,就像是說int;
而不是int a;
。
在這種情況下,您將結構(包含4個字節)和無符號整數(也是4個字節)映射到相同的內存位置。
我想你錯過了一點:OP知道工會是爲了什麼,他只是問工會內的無名結構。 – ereOn 2011-01-07 14:56:28
閱讀標題「你可能會用什麼名字的結構或聯盟?」我不認爲我錯過了整個觀點。但是,當我重讀它時,問題的最後一部分暗示了結構。 – 2011-01-07 15:07:59
您可以使用結構或類中的匿名結構對某些舊數據的值進行分組,以簡化實例的初始化(使用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])。但它有時可能有用。
+1。這是一個很好的例子,當正確的答案沒有任何投票,沒有回答問題的帖子有6票 – 2011-01-07 15:50:44
這主要是因爲struct和union非常相似。一般來說,只有在工會內部有匿名結構,在結構內部有匿名工會,但在工會內的結構或工會中嵌套結構大體上等同於直接列出其成員。
請注意,不應使用工會轉換值,因爲絕對沒有佈局保證。
這真的很好,我不知道。你爲我節省了很多擊鍵! – GWW 2011-01-07 15:09:21