【发布时间】:2012-08-25 00:23:32
【问题描述】:
我必须在跨越多个 DWORD 的位域中编写独立位。我目前使用的结构如下
typedef struct _myStruct
{
union
{
struct
{
DWORD field1 : 16
DWORD field2 : 8
DWORD field3 : 8
};
DWORD value0;
};
union
{
struct
{
DWORD field4 : 32;
}
DWORD value1;
};
} myStruct;
我这样做是为了让程序员可以直接访问独立的字段,而不是记住相应的 DWORD,即 myStruct.field1 等。
这在 Visual Studio 中运行良好,但是当我使用未命名的结构和联合时 GCC 会抱怨。为了纠正这一点,我尝试如下命名联合和结构:
union _DW0
{
struct _BF
{
DWORD field1 : 16
DWORD field2 : 8
DWORD field3 : 8
} BF;
DWORD value0;
} DW0;
但是现在访问对程序员不友好.. 即尝试对此进行编程的人必须记住每个字段属于哪个 DWORD。例如:myStruct.DW0.field1
有没有办法解决这个问题?
【问题讨论】:
-
TYPO: myStruct.DW0.field1 在最后一行被读取为 myStruct.DW0.BF.field1
-
您的问题似乎更多是关于对匿名结构支持而不是位域的支持。但是,您应该记住,如果您希望位域在编译器和平台之间具有“二进制可移植性”(即位域的布局匹配),那可能有点雷区。
-
也许值得解释一下为什么你不能使用 std::bitset 或 boost::dynamic_bitset
-
缺少 4 个分号 this works fine in gcc 4.3.4 and newer.
-
@Dave:在 gcc 4.3.4 和更新版本中运行良好和 独立于操作系统是完全不同的东西。
标签: c++ visual-studio gcc bit-fields