C++ 您可以使用无名结构或联合做什么?
我明白了C++ 您可以使用无名结构或联合做什么?,c++,C++,我明白了 union { uint32_t ip_address struct { uint8_t oct1; uint8_t oct2; uint8_t oct3; uint8_t oct4; }; }; 可能对某些人有用,但这里的struct示例中的struct: 看起来有点奇怪。有人能演示一个好的用例吗?在本例中,您可以将结构(包含4个字节)和无符号整数(也有4个字节)映射到同一内存位置。您
union {
uint32_t ip_address
struct {
uint8_t oct1;
uint8_t oct2;
uint8_t oct3;
uint8_t oct4;
};
};
可能对某些人有用,但这里的struct示例中的struct:
看起来有点奇怪。有人能演示一个好的用例吗?在本例中,您可以将结构(包含4个字节)和无符号整数(也有4个字节)映射到同一内存位置。您可以在结构或类中使用匿名结构来对一些纯旧数据值进行分组,以简化实例的初始化(使用
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));
}
};
#包括
阶级基础
{
私人:
int field1;
int field2;
公众:
Base()
{
//初始化字段1,字段2
}
虚空剂量仪();
};
派生类:公共基
{
私人:
结构
{
int field2;
国际领域3;
国际字段4;
// ...
int field99;
}数据;
公众:
派生的()
:Base()
{
memset(&data,0,sizeof(data));
//如果没有将这些值分组到匿名结构中
//您必须执行类似操作(不安全):
//memset(sizeof(Base)+(char*)this,0,sizeof(派生)-sizeof(Base));
}
};
注意,存在更好的替代方案(在我的示例中使用std::vector或int[99])。但它有时也很有用。在
struct
中的无名联合
是有意义的,因为它允许您引用联合的成员,而无需指定其名称,因此代码更短:
struct {
int a;
union {
int b, c, d;
};
} foo;
因此,访问联合的成员
就像访问包含结构的成员:foo.a
和foo.b
。否则,您必须使用foo.union\u name.b
访问工会成员
当然,使用这种结构的“用户”程序员应该知道设置foo.c
会影响foo.b
和foo.d
的值
出于同样的原因,可以做相反的操作,即将匿名结构
放入联合
:
union {
struct {
int a, b;
};
int c;
} foo;
这样可以同时使用foo.a
和foo.b
,并且foo.c
可以在另一种情况下使用
我想不出匿名结构或联合还有什么其他用途。“声明”匿名结构/联合是一种矛盾修饰法,就像说
int代码>而不是int a代码>这主要是因为结构和联合非常相似。通常,只有在联合中包含匿名结构和在结构中包含匿名联合才有用,但在结构中嵌套结构或在联合中包含联合基本上等同于直接列出其成员
请注意,不应使用联合来转换值,因为绝对没有布局保证。我认为您没有抓住要点:OP知道联合的用途,他只是询问联合中的无名结构。通过标题“您可能会使用无名结构或联合做什么?”我认为我没有抓住要点。但是,是的,问题的最后一部分在我重读时确实提到了struct。这真的很好,我不知道。你帮我省去了很多击键的麻烦!这是关于匿名联合的,如果只是为了警告,那么OP?+1提供的示例中的匿名结构呢!数据布局完全由编译器自行决定,因此它不仅不可移植,而且还可能根据编译器选项等而改变。#pragma pack
不是用来提供这种保证和可移植性的吗?#pragma根据定义是不可移植的。+1。这是一个很好的例子,正确答案没有任何投票权,而没有回答问题的帖子有6票