gpt4 book ai didi

c - 一次测试 C 中的所有位域

转载 作者:太空宇宙 更新时间:2023-11-04 00:23:55 25 4
gpt4 key购买 nike

假设我有一个 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 这样的智能编译器真的能够推导出它吗?

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

最佳答案

这不可能以任何确定性的方式进行移植。问题在于 C 标准不保证这些位的任何内容:您无法知道哪个位是 LSB,也不知道是否有填充。最重要的是,字节序也是一个问题。 (理论上,不同的符号格式。)See this for details .

理论上,您可以在该位字段与具有 : 3 位的位字段之间创建 union ,但这种做法的结果将不可预测,也无法明确定义。

最好的解决方案是摆脱位域并用确定的、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)
...

关于c - 一次测试 C 中的所有位域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40362031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com