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

时间:2015-07-06 14:33:28

标签: c enums typedef bit-fields

对于位域新手,我需要一些建议,以了解我在网上看过的各种例子。我希望使用位域而不是位掩码来提高可读性,以及以后为新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

bitwise indexing in C?

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

我从C#/ C ++工作几年后回到C,并重新学习了一些小问题。

2 个答案:

答案 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