假设我有一个 C 结构定义为
struct data {
/* some memebers */
int flag_a:1;
int flag_b:1;
int flag_c:1;
/* some other members */
}
有没有办法利用位域在内存中表示为单个 int 并写入条件s.flag_a | s.flag_b | s.flag_c
作为一个更简单的表达,例如s.flags
?
或者像 GCC 这样的智能编译器能够真正推断出它吗?
Edit:为了让自己绝对清楚:我正在寻找一种便携式方法来测试所有设置的标志,而无需单独显式测试每个标志。
这不可能以任何确定性的方式可移植地完成。问题是 C 标准不保证这些位的任何内容:您无法知道哪一位是 LSB,也无法知道是否有填充。最重要的是,字节顺序也是一个问题。 (理论上,不同的符号格式。)详情请参阅此.
理论上,您可以在该位字段与以下位字段之间创建一个并集:: 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)
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)