Odpowiednik hacku Struct w C ++
Znany jest hack struct, w którym macie tablicę o długości 0 jako ostatni element struktury z C90 i C99, a wraz z wprowadzeniem elementów elastycznej tablicy w C99, mamy nawet znormalizowany sposób jej używania[]
. Niestety, C ++ nie dostarcza takiej konstrukcji i (przynajmniej z Clangiem)3.4), kompilowanie struktury z jednym z nich[0]
lub[]
wygeneruje ostrzeżenie o kompilacji--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];
i podobnie
$ 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[];
Moje pytanie zatem brzmi; powiedzmy, że chcę mieć strukturę, która zawiera tablicę o zmiennej wielkości jako ostatni element w C ++. Jaka jest właściwa rzecz, biorąc pod uwagę kompilator, który obsługuje oba? Powinienem iść z hackiem struct[0]
(który jest rozszerzeniem kompilatora) lub FAM[]
(która jest funkcją C99)? O ile mi wiadomo, albo zadziałają, ale staram się dowiedzieć, które jest mniejsze zło?
Zanim ludzie zaczną sugerować, że mająint*
do oddzielnie przydzielonego fragmentu pamięci w strukturze, co nie jest satysfakcjonującą odpowiedzią. Chcę przydzielić pojedynczy kawałek pamięci do przechowywania zarówno elementów mojej struktury, jak i tablicy. Używanie std :: vector również należy do tej samej kategorii. Jeśli zastanawiasz się, dlaczego nie chcę używać wskaźnika, toOdpowiedź R. na inne pytanie daje dobry przegląd.
W innych miejscach pojawiły się podobne pytania, ale żadne nie daje odpowiedzi na to konkretne pytanie:
Czy elastyczne elementy tablicy są poprawne w C ++?: Bardzo podobne, ale pytanie brzmi, czy FAM jest poprawny w C ++ (nie). Szukam dobrego powodu, aby wybrać jeden lub drugi.Zgodny wariant starego „struct hack”: Proponuje alternatywę, ale nie jest ani ładna, ani zawsze poprawna (co jeśli dopełnienie zostanie dodane do struktury?). Dostęp do elementów później nie jest tak czysty, jak to się robie.things[42]
.