C中的位域 - 对齐与初始化

iDr*_*Car -2 c enums typedef bit-fields

作为bitfields的新手,我需要一些建议,以了解我在网上看过的各种例子.我想使用位域而不是位掩码来提高可读性,以及稍后为新ppl维护.

这是声明位域的常用方法:

typedef enum 
{
   unsigned int x: 1;
   unsigned int y: 1;   
}statusBits1;
Run Code Online (Sandbox Code Playgroud)

到目前为止很好,然后我看到:

typedef enum 
{
   unsigned int x = 1 << 0,
   unsigned int y = 1 << 1   
}statusBits2;
Run Code Online (Sandbox Code Playgroud)

在我的学习中,我相信这会为任何statusBits2数据类型设置默认值.这是否也将x和y的大小设置为1比特字段,如statusBits1?两者的结合是我正在寻找的.

提前致谢.

编辑:谢谢你的答案!你强迫我重读我一直在学习的东西.我正在混合各种关于位域和位掩码的帖子的信息!

即:

在Objective-C中声明和检查/比较(bitmask-)枚举

C中的按位索引?

http://forum.codecall.net/topic/56591-bit-fields-flags-tutorial-with-example/

我在C#/ C++工作几年后回到C,重新学习一点点.

urz*_*eit 6

您的第一个示例不表示位字段.这将是一个struct而不是一个enum.

在较新的C++中,您可以为struct成员定义默认值:

typedef struct
{
    unsigned int x = 1 << 0; /* Default value 1 << 0 = 1 */
    unsigned int y = 1 << 1; /* Default value 1 << 1 = 2 */
} statusBits2;
Run Code Online (Sandbox Code Playgroud)

但是 - 这在标准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;
Run Code Online (Sandbox Code Playgroud)

我不知道在C和C++中都没有定义默认值和字段宽度的方法.

让我解释一下你的第二个例子的含义(正如你所写的那样enum):

你的第二个代码几乎表示枚举.这是一个整数类型,可以保存一个表示的值.例如:

typedef enum
{
    fish = 3,
    gorilla = 7,
    rabbit = 9
} animal_t;
Run Code Online (Sandbox Code Playgroud)

是一个类型,可以有一个值3,7和9,您可以使用它们的名称,例如:

animal_t my_animal = fish;
Run Code Online (Sandbox Code Playgroud)

(实际上它也可以保存其他整数值).

枚举和结构都可以帮助您使代码更清晰,更具描述性,但不要混淆它们!

您的示例都不是有效的C或C++代码.