Struktur-Hack-Äquivalent in C ++
Der Struktur-Hack, bei dem Sie ein Array der Länge 0 als letztes Mitglied einer Struktur aus C90 und C99 haben, ist allgemein bekannt, und mit der Einführung flexibler Array-Mitglieder in C99 haben wir sogar eine standardisierte Methode zu dessen Verwendung erhalten[]
. Leider bietet C ++ kein solches Konstrukt und (zumindest mit Clang3.4), Kompilieren einer Struktur mit entweder[0]
oder[]
wird eine Kompilierungswarnung mit ergeben--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];
und ähnlich
$ 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[];
Meine Frage lautet dann: Angenommen, ich möchte eine Struktur haben, die ein Array mit variabler Größe als letztes Element in C ++ enthält. Was ist das Richtige für einen Compiler, der beides unterstützt? Soll ich mit dem struct hack gehen[0]
(das ist eine Compiler-Erweiterung) oder die FAM[]
(Was ist eine C99-Funktion)? Soweit ich es verstehe, wird beides funktionieren, aber ich versuche herauszufinden, welches das kleinere Übel ist.
Auch bevor Leute anfangen vorzuschlagen, eineint*
Dies ist jedoch keine zufriedenstellende Antwort auf einen separat zugewiesenen Teil des Speichers in der Struktur. Ich möchte ein einzelnes Stück Speicher zuweisen, um sowohl meine Struktur als auch die Array-Elemente aufzunehmen. Die Verwendung eines std :: vector fällt ebenfalls in dieselbe Kategorie. Wenn Sie sich fragen, warum ich stattdessen keinen Zeiger verwenden möchte, wird derAntwort von R. zu einer anderen frage gibt es einen guten überblick.
Es gab einige ähnliche Fragen an anderer Stelle, aber keine gibt eine Antwort auf diese spezielle Frage:
Sind flexible Array-Mitglieder in C ++ gültig?: Sehr ähnlich, aber die Frage ist, ob FAM in C ++ gültig ist (nein). Ich suche einen guten Grund, den einen oder anderen auszuwählen.Konforme Variante des alten "struct hack": Schlägt eine Alternative vor, die aber weder hübsch noch immer korrekt ist (was ist, wenn der Struktur ein Auffüllen hinzugefügt wird?). Der spätere Zugriff auf die Elemente ist ebenfalls nicht so sauber wie dies der Fall iste.things[42]
.