仅清除结构的位字段成员吗?

我有一个struct,如下所示:

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 router.delete(`/category/:id/delete`,async (req,res) => { try { if (!req.params.id) res.send("missing id"); else { await Product.removeAll({ category: req.params.id }); const categoryToDelete = await Category.findById(req.params.id); await categoryToDelete.remove(); res.send("category deleted"); } } catch (error) { res.status(400).json({ error: error.message }); } }); 设为零,并且不能保证其他涉及并集的答案都能奏效,特别是如果存在的标记值多于int的话。

w690979631 回答:仅清除结构的位字段成员吗?

只需对标志使用单独的struct

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,sizeof(x.flags));
,

进行一些细微的调整,您可以使用offsetof宏在结构内查找“标志”数据的开头和结尾,然后使用memset清除相关的内存。 (请注意,您不能直接在位域上使用offsetof,因此要添加flag_beg成员!)

这是一个可行的示例:

#include <stdio.h>
#include <stddef.h>  // defines offsetof
#include <string.h>  // declares memset

struct Foo {
    unsigned int id;
    unsigned int flag_beg;    // Could be unsigned char to save space
    unsigned int flag_1 : 1;
    unsigned int flag_2 : 1;
    unsigned int flag_3 : 1;
    unsigned int flag_end;    // Could be unsigned char to save space
    // 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;
    // ...
};

#define FBEG (offsetof(struct Foo,flag_beg))
#define FEND (offsetof(struct Foo,flag_end))

int main()
{
    struct Foo f;
    f.id = 3; f.flag_1 = 1; f.flag_2 = 0; f.flag_3 = 1;
    f.some_data = 33; f.some_more_data = 16.2f;

    printf("%u %u %u %u %d %f\n",f.id,f.flag_1,f.flag_2,f.flag_3,f.some_data,f.some_more_data);
    memset((char*)(&f) + FBEG,FEND - FBEG);
    printf("%u %u %u %u %d %f\n",f.some_more_data);
    return 0;
}
本文链接:https://www.f2er.com/2541690.html

大家都在问