【发布时间】:2019-04-15 14:29:14
【问题描述】:
我有一个包含 8 个布尔变量的 C 结构,我想将它们打包在 1 个字节中。
这是我定义结构的方式:
typedef struct
{
bool a : 1;
bool b : 1;
bool c : 1;
bool d : 1;
bool e : 1;
bool f : 1;
bool g : 1;
bool h : 1;
} test_struct;
然后我想确定设置值是可以的:
test_struct my_struct = { 0 };
my_struct.e = true;
...并像这样进行测试:
if (my_struct.e)
// do something
所有编译器都会提供预期的结果,即使用一位来存储布尔值吗?
【问题讨论】:
-
我认为这取决于编译器,但你为什么不使用 uint8_t 和位掩码?
-
如果
bool是_Bool的类型定义,那么这应该可以正常工作:c11 标准草案 n1570:6.2.5 类型 2 声明为类型 _Bool 的对象足够大,可以存储值 0 和 1。 [...] 6 [...] 类型 _Bool 和对应于标准有符号整数类型的无符号整数类型是标准无符号整数类型。 [...] -
如果您担心不同的编译器“提供[ing]预期结果”,因为您需要交叉编译器兼容性,您不能使用位域,因为标准允许每个编译器实现它们不同,例如不同的尺寸和不同的排序。