对于位域新手,我需要一些建议,以了解我在网上看过的各种例子。我希望使用位域而不是位掩码来提高可读性,以及以后为新ppl轻松维护。
这是声明位域的常用方法:
i
到目前为止一直很好,然后我看到了:
typedef enum
{
unsigned int x: 1;
unsigned int y: 1;
}statusBits1;
在我的学习中,我相信这会为任何statusBits2数据类型设置默认值。这是否也将x和y的大小设置为1比特字段,如statusBits1? 两者的结合是我正在寻找的。
提前感谢。
编辑: 谢谢你的答案!你强迫我重读我正在学习的东西。我正在混合各种关于位域和位掩码的帖子的信息!
即:
Declaring and checking/comparing (bitmask-)enums in Objective-C
http://forum.codecall.net/topic/56591-bit-fields-flags-tutorial-with-example/
我从C#/ C ++工作几年后回到C,并重新学习了一些小问题。
答案 0 :(得分:6)
您的第一个示例不表示位字段。这将是struct
而不是enum
。
在较新的C ++中,您可以为struct members定义默认值:
typedef struct
{
unsigned int x = 1 << 0; /* Default value 1 << 0 = 1 */
unsigned int y = 1 << 1; /* Default value 1 << 1 = 2 */
} statusBits2;
但是 - 这在标准C和较旧的C ++标准中是不可能的,并且不设置字段宽度。您还可以设置字段宽度:
typedef struct
{
unsigned int x : 1; /* Field width 1 bit, no default */
unsigned int y : 1; /* Field width 1 bit, no default */
} statusBits2;
我不知道如何在C和C ++中定义默认值和字段宽度。
让我解释你的第二个例子的含义(正如你用enum
所写的那样):
您的第二个代码几乎表示枚举。这是一个整数类型,可以保存一个表示的值。例如:
typedef enum
{
fish = 3,
gorilla = 7,
rabbit = 9
} animal_t;
是一种类型,可以使用值3,7和9中的一个,您可以按名称使用它们,例如:
animal_t my_animal = fish;
(实际上它也可以容纳其他整数值。)
枚举和结构都可以帮助您使代码更清晰,更具描述性,但不要混淆它们!
您的所有示例都不是有效的C或C ++代码。
答案 1 :(得分:2)
StatusBits2
根本不包含位字段。它包含两个unsigned ints
,默认值为1和2.但是,它也无效C.位字段需要struct
而不是enum
。