gpt4 book ai didi

只清除结构的位域成员?

转载 作者:行者123 更新时间:2023-12-04 09:10:58 24 4
gpt4 key购买 nike

我有一个像下面这样的结构:

struct Foo {
unsigned int id;
unsigned int flag_1 : 1;
unsigned int flag_2 : 1;
unsigned int flag_3 : 1;
// Some arbitrary number of further flags. Code is
// automatically generated and number will vary.
// Notably, it may be more than an int's worth.
int some_data;
float some_more_data;
// ...
};

有时,我需要将所有标志重置为零,同时保留结构的其余部分。一种方法显然是将每个标志单独设置为 0,但感觉应该有一种方法可以一次性完成。这可能吗?

(请注意,我对不使用位字段持开放态度,但这是有时会在内存受限系统上运行的代码,因此内存节省非常有吸引力。)

编辑:

这里有一个类似的问题:Reset all bits in a c bitfield

但是,该问题中的结构完全是位域。我不能简单地将整个结构 memset 设置为零,并且不能保证涉及 union 的其他答案有效,特别是如果有超过 int 值的标志。

最佳答案

只需为标志使用一个单独的结构:

struct Foo_flags {
unsigned int flag_1 : 1;
unsigned int flag_2 : 1;
unsigned int flag_3 : 1;
// ...
};

struct Foo {
unsigned int id;
struct Foo_flags flags;
int some_data;
float some_more_data;
// ...
};

或者更简单的嵌套struct:

struct Foo {
unsigned int id;

struct {
unsigned int flag_1 : 1;
unsigned int flag_2 : 1;
unsigned int flag_3 : 1;
// ...
} flags;

int some_data;
float some_more_data;
// ...
};

然后,稍后在您的代码中:

struct Foo x;
// ...
x.flags.flag_1 = 1;
// ...
memset(&x.flags, 0, sizeof(x.flags));

关于只清除结构的位域成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60955994/

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