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

Bitfields in C - aligning vs initializing

作为位域的新手,我需要一些关于我在网上看到的各种例子的建议。我想使用位域而不是位掩码来提高可读性,并在以后为新的 ppl 简化维护。

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

typedef enum 
{
   unsigned int x: 1;
   unsigned int y: 1;   
}statusBits1;

到目前为止一切顺利,然后我看到了:

typedef enum 
{
   unsigned int x = 1 << 0,
   unsigned int y = 1 << 1   
}statusBits2;

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

提前致谢。

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

即这些:

Declaring and checking/comparing (bitmask-)enums in Objective-C

bitwise indexing in C?

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

我在 C#/C++ 工作了几年后回到了 C,并重新学习了 bit fiddling。

StatusBits2 根本不包含位域。它包含两个 unsigned ints,默认值为 1 和 2。但是,它也是无效的 C。位字段需要 struct 而不是 enum

您的第一个示例不表示位域。这将是 struct 而不是 enum

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

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):

你的第二个代码almost表示一个枚举。这是一个整数类型,可以容纳 one 个表示值。例如:

typedef enum
{
    fish = 3,
    gorilla = 7,
    rabbit = 9
} animal_t;

是一种类型,可以具有值 3、7 和 9 中的一个,您可以通过它们的名称使用这些值,例如:

animal_t my_animal = fish;

(事实上它也可以保存其他整数值)。

枚举和结构都有助于使您的代码更清晰、更具描述性,但不要将它们混为一谈!

None 个示例是有效的 C 或 C++ 代码。