一次测试C中的所有位文件

Dav*_*vid 1 c

假设我将C结构定义为

struct data {
    /* some memebers */

    int flag_a:1;
    int flag_b:1;
    int flag_c:1;

    /* some other members */
}
Run Code Online (Sandbox Code Playgroud)

有没有办法利用在内存中表示为单个int的位域,并将条件写s.flag_a | s.flag_b | s.flag_c为更简单的表达式,如s.flags

或者像GCC这样的智能编译器是否能够实际推断它?

编辑:为了让自己绝对清楚:我正在寻找一种可移植的方法来测试所有正在设置的标志,而无需单独显式地测试每个标志.

Lun*_*din 7

这不可能以任何确定的方式进行移植.问题是C标准不能保证这些位的任何内容:你不知道哪个位是LSB,也不知道是否有填充.最重要的是,endianess也是一个问题.(理论上,不同的签名格式.)有关详细信息,请参阅此处.

从理论上讲,你可以在这个位域和一个: 3位之间创建一个联合,但是这种实践的结果不可预测也不能很好地定义.

最好的解决方案是摆脱位字段并用确定性的100%便携式解决方案替换它:

typedef struct
{
  uint8_t flags;
} data_t

#define FLAG_A 0x01u
#define FLAG_B 0x02u
#define FLAG_C 0x04u
#define FLAG_ALL (FLAG_A | FLAG_B | FLAG_C)

data_t data = { .flags = FLAG_A | FLAG_B | FLAG_C};

if(data.flags & FLAG_ALL)
  ...
Run Code Online (Sandbox Code Playgroud)