在 C 中初始化位域结构的最佳方法是什么?

新手上路,请多包涵

在 C++ 中,我有一个包含匿名位域结构的类。我想将其初始化为零,而不必手动写出所有字段。

我可以想象将初始化放在三个地方:

  1. 在位域中创建构造函数
  2. 在包含类的构造函数的初始化列表中清零
  3. 在包含类的构造函数主体中清零

这个位域有很多字段,我不想一一列举。

例如看下面的代码:

 class Big {
    public:
        Big();

        // Bitfield struct
        struct bflag_struct {
            unsigned int field1 : 1;
            unsigned int field2 : 2;
            unsigned int field3 : 1;
            // ...
            unsigned int field20 : 1;
            // bflag_struct(); <--- Here?
        } bflag;

        unsigned int integer_member;
        Big         *pointer_member;
}

Big::Big()
  : bflag(),             // <--- Can I zero bflag here?
    integer_member(0),
    pointer_member(NULL)
{
    // Or here?
}

其中之一更可取吗?还是我还缺少其他东西?

编辑:根据下面接受的答案(由 Ferruccio 提供),我选择了这个解决方案:

 class Big {
    // ...

    struct bflag_struct {
        unsigned int field 1 : 1;
        // ...
        bflag_struct() { memset(this, 0, sizeof *this); };
    }

    // ...
}

原文由 Ben Martin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 772
1 个回答

你总是可以在你的构造函数中这样做:

 memset(&bflag, 0, sizeof bflag);

原文由 Ferruccio 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题