Структурный хак, в котором у вас есть массив длины 0 в качестве последнего члена структуры из C90 и C99, хорошо известен, и с введением гибких членов массива в C99 мы даже получили стандартизованный способ его использования с []
. К сожалению, С++ не предоставляет такой конструкции и (по крайней мере, с помощью Clang 3.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[];
Тогда мой вопрос: скажем, что я хочу иметь структуру, содержащую массив переменных размера в качестве последнего элемента на С++. Что правильно делать, учитывая компилятор, который поддерживает оба? Должен ли я пойти со структурой hack [0]
(которая является расширением компилятора) или FAM []
(которая является функцией C99)? Насколько я понимаю, либо будет работать, но я пытаюсь выяснить, что является меньшим злом?
Кроме того, прежде чем люди начнут предлагать сохранить int*
в отдельно выделенную часть памяти в структуре, это не является удовлетворительным ответом. Я хочу выделить один кусок памяти для хранения как моей структуры, так и элементов массива. Использование std::vector также относится к той же категории. Если вам интересно, почему я не хочу использовать указатель вместо этого, R. ответ на другой вопрос дает хороший обзор.
В некоторых случаях были некоторые подобные вопросы, но никто не дал ответа на этот конкретный вопрос:
- Являются ли гибкие члены массива действительными в С++?: Очень похоже, но вопрос в том, есть ли FAM в С++ (нет). Я ищу хорошую причину, чтобы выбрать тот или другой.
- Соответствующий вариант старого "взлома структуры" : предлагает альтернативу, но это не красиво и не всегда правильно (что, если добавление добавляется в структуру?), Доступ к элементам позже также не так чист, как выполнение
e.things[42]
.