How to zero array members when my compiler isn't standard conform

有些话、适合烂在心里 提交于 2019-12-01 22:22:14

问题


My compiler (C++Builder6) syntactically allows array member initialization (at least with zero), but actually it doesn't really do it. So the assert in the example given below fails depending from the context.

#include <assert.h>

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

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

Changing the compiler isn't an option at the moment. My question is: what will be the best way to "repair" this flaw with respect to future portability and standard conformance?


Edit: As it turns out, my first example was too short. It missed the point, that the fill level of the array is so essential, that it has to be stored very close to the array, which is: in the same class.

Even if the original problem remains, my actual problem pattern is usually this:

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

回答1:


I think you may use this:

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

This way you will solve your problem while nothing is wrong with portability and standard conformance!




回答2:


You may use fill_n like suggested in: C/C++ initialization of a normal array with one default value

If no fill_n is available, you can always use memset like:

TT() {memset(b, 0, sizeof b);}



回答3:


I would like to append previous posts that if you are using a character array as a string then it is enough to write in the constructor

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



来源:https://stackoverflow.com/questions/19905686/how-to-zero-array-members-when-my-compiler-isnt-standard-conform

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!