我使用以下 union 来简化字节,半字节和位操作:
union Byte
{
struct {
unsigned int bit_0: 1;
unsigned int bit_1: 1;
unsigned int bit_2: 1;
unsigned int bit_3: 1;
unsigned int bit_4: 1;
unsigned int bit_5: 1;
unsigned int bit_6: 1;
unsigned int bit_7: 1;
};
struct {
unsigned int nibble_0: 4;
unsigned int nibble_1: 4;
};
unsigned char byte;
};
它的工作原理不错,但也会生成以下警告:
好的,很高兴知道。但是...如何从我的g++输出中得到这个警告?没有这个问题,是否有可能写类似这种 union 的东西?
最佳答案
gcc编译器选项 -fms-extensions
将允许非标准的匿名结构,而不会发出警告。
(该选项启用了它认为的“Microsoft扩展”)
使用此约定,您也可以在有效的C++中达到相同的效果。
union Byte
{
struct bits_type {
unsigned int _0: 1;
unsigned int _1: 1;
unsigned int _2: 1;
unsigned int _3: 1;
unsigned int _4: 1;
unsigned int _5: 1;
unsigned int _6: 1;
unsigned int _7: 1;
} bit;
struct nibbles_type {
unsigned int _0: 4;
unsigned int _1: 4;
} nibble;
unsigned char byte;
};
这样,您的非标准byte.nibble_0
便成为合法的byte.nibble._0