我认为使用C位域而不是int
以及一堆#define
s可以提供更好的读取代码,并减少在添加新字段时调整现有代码的需要。有没有可能使用int
- #define
- 方法提供的单个命令将C位域中的所有位重置为零?
示例:
#define MYFLAG_1 0x01
#define MYFLAG_2 0x02
#define MYFLAG_3 0x04
int myflags = MYFLAG_1 | MYFLAG_3;
/* Reset: */
myflags = 0;
与
struct {
int flag_1 : 1;
int flag_2 : 1;
int flag_3 : 1;
} myflags;
myflags.flag_1 = 1;
myflags.flag_3 = 1;
/* Reset: */
myflags.flag_1 = 0;
myflags.flag_2 = 0;
myflags.flag_3 = 0;
在第一个示例的现有代码中,向字段添加其他标志不需要更改(除#define之外),但需要使用代码重置其他标志字段。
答案 0 :(得分:2)
我只是建议:
memset(&my_flags, 0, sizeof(myflags));
这样,你仍然可以在你的结构中添加字段,由于sizeof
,它们将被重置。
答案 1 :(得分:2)
我想将评论扩展到答案:
使用联合,您可以拥有一个数字变量,并且您的位字段共享相同的内存:
typedef union{
struct {
int flag_1 : 1;
int flag_2 : 1;
int flag_3 : 1;
};
unsigned int value;
} MyBitField;
// ...
MyBitField myflags;
myflags.flag_1 = 1;
myflags.flag_3 = 1;
/* Reset: */
//myflags.flag_1 = 0;
//myflags.flag_2 = 0;
//myflags.flag_3 = 0;
myflags.value = 0;
现在,您可以轻松地将所有位设置为0.联合将始终占用其中最大对象所需的内存量。因此,如果您需要比INT更多的位,您也可以使用long
或long long
。
我还没有见过计算机编程中的工会"到目前为止,但对于微控制器,它们经常被使用。