4

我的编译器(C++Builder6)在语法上允许数组成员初始化(至少为零),但实际上它并没有真正做到这一点。因此,下面给出的示例中的断言会根据上下文而失败。

#include <assert.h>

struct TT {
    char b[8];
    TT(): b() {}
};

void testIt() {
    TT t;
    assert(t.b[7] == 0);
}

更改编译器目前不是一种选择。我的问题是:就未来的可移植性和标准一致性而言,“修复”这个缺陷的最佳方法是什么?


编辑: 事实证明,我的第一个例子太短。它忽略了这一点,数组的填充级别非常重要,它必须存储在非常接近数组的位置,即:在同一个类中。

即使原来的问题仍然存在,我的实际问题模式通常是这样的:

struct TT2 {
    int size;
    char data[8];
    // ... some more elements
    TT2(): size(0), data() {}
    // ... some more methods
};
4

3 回答 3

4

我想你可以使用这个:

TT() { std::fill(b, b + 8, char()); }

通过这种方式,您将解决您的问题,而便携性和标准一致性没有任何问题!

于 2013-11-11T11:56:52.783 回答
3

您可以像以下建议的那样使用 fill_n: C/C++ 初始化具有一个默认值的普通数组

如果没有可用的 fill_n,您可以随时使用 memset,例如:

TT() {memset(b, 0, sizeof b);}
于 2013-11-11T12:05:21.910 回答
1

我想附加以前的帖子,如果您使用字符数组作为字符串,那么在构造函数中写入就足够了

TT() { b[0] = '\0'; }

于 2013-11-11T12:00:39.350 回答