假设我将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这样的智能编译器是否能够实际推断它?
编辑:为了让自己绝对清楚:我正在寻找一种可移植的方法来测试所有正在设置的标志,而无需单独显式地测试每个标志.
这不可能以任何确定的方式进行移植.问题是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)
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |