如何将Struct与位字段一起使用

如何将Struct与位字段一起使用,c,struct,C,Struct,我使用的是多个程序员共享的文件,其结构如下: typedef struct _APPLE{ ULONG appleID; struct{ ULONG isBig: 1; ULONG isRed: 1; ULONG isFresh: 1; ULONG isGood: 1; ULONG bReserved: 28; }; }APPLE; 由于文件是共享的,我无法编辑它。我想在代码中使用此APPLE结构,并想为其

我使用的是多个程序员共享的文件,其结构如下:

typedef struct _APPLE{
   ULONG appleID;
   struct{
       ULONG isBig: 1;
       ULONG isRed: 1;
       ULONG isFresh: 1;
       ULONG isGood: 1;
       ULONG bReserved: 28;
   };
}APPLE;

由于文件是共享的,我无法编辑它。我想在代码中使用此APPLE结构,并想为其每个成员提供值。我该怎么做呢?

首先,在标准C中不能有匿名嵌套结构,它是一些编译器使用的扩展

因此,您必须命名位字段结构:

typedef struct _APPLE{
   ULONG appleID;
   struct{
       ULONG isBig: 1;
       ULONG isRed: 1;
       ULONG isFresh: 1;
       ULONG isGood: 1;
       ULONG bReserved: 28;
   } flags;
}APPLE;
然后只需使用普通点符号访问字段:

APPLE apple;
apple.appleID = 5;
apple.flags.isBig = 1;
apple.flags.isRed = 0;


虽然一个位字段的多个成员可能共享相同的
int
,但它们仍然彼此独立。因此,更改位字段的一个成员不会更改任何其他成员。

根据ISO/IEC 9899:2011,第§6.7.2.1节“结构和联合说明符”


一个实现可以分配任何足够大的可寻址存储单元来容纳一个位字段。如果仍有足够的空间,结构中紧跟在另一位字段之后的位字段应打包到同一单元的相邻位中。如果空间不足,则将定义是否将不适合的位字段放入下一个单元或与相邻单元重叠。单元内位字段的分配顺序(从高阶到低阶或从低阶到高阶)由实现定义。未指定可寻址存储单元的对齐方式。

您在创建其实例时面临的问题是什么?做苹果a有什么问题吗;a、 isBig=0?我能做到。但当我这样做时,a.isBig=0;内存是像联合一样共享的还是我可以分别为每个成员提供值?不是。它是您自己创建的对象。我使用的是Visual Studio 2012,我认为这里支持它。因为其他程序员正在使用它。