【发布时间】:2014-05-07 18:46:42
【问题描述】:
我希望这不是一个重复的问题,但我已经进行了一些详细的搜索,但之前没有找到我的确切情况。
我有一个简单的结构,我也希望能够以简单的字节数组的形式访问它
union
{
struct
{
unsigned char a;
unsigned char b;
// ... Some other members ...
unsigned char w;
};
unsigned char bytes[sizeof( what? )];
} myUnion;
请注意,该结构没有命名,也没有给出自己的成员名称。这样我就可以使用myUnion.a 访问该成员,而不是myUnion.myStruct.a。
但是,如果没有名称,除了每次更改内容时手动计算之外,我如何获取 myUnion.bytes[] 的结构大小?
我目前的解决方法是使用#define 来弥补myUnion.myStruct 的问题,但这具有破坏我在编辑器中的自动完成功能的负面影响,并且也使我的数据结构更难理解.
有什么想法吗?
注意:这是在 8 位处理器上运行的。单词对齐等没有问题。也就是说,可能应该说明任何警告,以免其他人不恰当地使用建议的解决方案。
【问题讨论】:
-
使用 offsetof()。 cplusplus.com/reference/cstddef/offsetof。 imo会得到任何错误的结果。
-
这不是 union 应该使用的方式,而且非常危险。如果你幸运的话,编译器不会在你的结构中添加任何填充,它会工作。
-
@RedAlert 您可以“询问编译器”而不是在元素之间添加填充,但每当您看到类似的内容时,您应该假设它不会是可移植的。
-
旁注:标准 C++ 中不允许在联合/其他类中使用匿名结构。它们甚至在 C99 中都不允许,最后 C11 增加了对它们的(官方)支持。 g++ 和 clang++ 支持它们作为语言扩展。
-
我认为只有一个普通的结构会简单得多;然后通过强制转换或函数调用以
bytes的身份访问它。您使用的非标准结构和技巧越少,您在路上遇到的麻烦就越少
标签: c++ c struct sizeof unions