Структурный эквивалент взлома в C ++
Хак с структурой, где у вас есть массив длины 0 в качестве последнего члена структуры из C90 и C99, хорошо известен, и с введением гибких членов массива в C99 мы даже получили стандартизированный способ его использования с[]
, К сожалению, C ++ не предоставляет такой конструкции, и (по крайней мере, с Clang3,4), компилируя структуру с[0]
или же[]
выдаст предупреждение компиляции с--std=c++11 -pedantic
:
$ cat test.cpp
struct hack {
char filler;
int things[0];
};
$ clang++ --std=c++11 -pedantic test.cpp
\test.cpp:3:14: warning: zero size arrays are an extension [-Wzero-length-array]
int things[0];
и аналогично
$ cat test.cpp
struct fam {
char filler;
int things[];
};
$ clang++ --std=c++11 -pedantic test.cpp
\test.cpp:3:7: warning: flexible array members are a C99 feature [-Wc99-extensions]
int things[];
Мой вопрос тогда такой: скажем, что я хочу иметь структуру, которая содержит массив переменного размера в качестве последнего элемента в C ++. Как правильно поступить с компилятором, который поддерживает оба? Должен ли я пойти с взломать структуру[0]
(который является расширением компилятора), или FAM[]
(что является функцией C99)? Насколько я понимаю, либо сработает, но я пытаюсь выяснить, что является меньшим злом?
Кроме того, прежде чем люди начнут предлагать сохранитьint*
вместо этого выделенному фрагменту памяти в структуре, это не является удовлетворительным ответом. Я хочу выделить один фрагмент памяти для хранения моей структуры и элементов массива. Использование std :: vector также относится к той же категории. Если вам интересно, почему я не хочу использовать указатель вместо этого,Ответ Р. на другой вопрос дает хороший обзор.
В других местах были подобные вопросы, но ни один из них не дал ответа на этот конкретный вопрос:
Допустимы ли члены гибкого массива в C ++?: Очень похоже, но вопрос в том, допустим ли FAM в C ++ (нет). Я ищу вескую причину, чтобы выбрать один или другой.Соответствующий вариант старого «struct hack»: Предлагает альтернативу, но она не красива и не всегда корректна (что если заполнение добавлено в структуру?). Доступ к элементам позже также не так чист, как при выполненииe.things[42]
.