我可以看到你可能使用什么名称的结构或联合?
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