Как обнулить элементы массива, когда мой компилятор не соответствует стандарту

Мой компилятор (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

Решение

Я думаю, что вы можете использовать это:

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

Таким образом, вы решите свою проблему, пока нет ничего плохого в переносимости и соответствии стандартам!

4

Другие решения

Вы можете использовать fill_n, как предложено в:
C / C ++ инициализация нормального массива с одним значением по умолчанию

Если нет fill_n, вы всегда можете использовать memset, например:

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

Я хотел бы добавить предыдущие посты, что если вы используете массив символов в качестве строки, то достаточно написать в конструкторе

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

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector