statische arrays definiert und mit unbekannter Größe, leere Klammern?
Für den C++ - code-fragment:
class Foo {
int a[]; //no error
};
int a[]; //error: storage size of 'a' isn't known
void bar() {
int a[]; //error: storage size of 'a' isn't known
}
warum nicht auch die member-Variablen verursachen einen Fehler zu? und was ist der Sinn dieser member-variable ist?
Ich bin mit gcc version 3.4.5 (mingw-vista special) durch CodeBlocks 8.02.
Auf Visual Studio Express 2008 - Microsoft(R) C/C++ Optimizing Compiler 15.00.30729.01 für 80x86, bekam ich folgende Meldungen:
class Foo {
int a[]; //warning C4200: nonstandard extension used : zero-sized array in struct/union - Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
};
int a[];
void bar() {
int a[]; //error C2133: 'a' : unknown size
}
Nun, das benötigt einige Erläuterungen zu.
- Die Beschriftung erwähnt "statische arrays". Wo sind diese "statische arrays" in deiner Frage? Ich sehe nicht einen einzigen Verweis auf eine "statische arrays".
- Ich meine, statisch zugewiesenen arrays. Bitte fühlen Sie sich frei zu Bearbeiten-die Frage, ob Sie als notwendig ansehen. Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
C99 unterstützt sowas nennt man " flexible array member ist erlaubt, um das Letzte Mitglied einer struct. Wenn Sie die dynamische Zuordnung solch einer Struktur können Sie erhöhen die Menge angefordert
malloc()
zu bieten Speicher für das array.Einige Compiler fügen Sie diese als eine Erweiterung C90 und/oder C++.
So können Sie code wie den folgenden:
Kann man nicht definieren, eine Struktur mit einem flexible array-member-direkt (als eine lokale oder eine Globale/statische variable), da der compiler nicht wissen, wie viel Speicher zu reservieren für Sie.
Ich bin ehrlich gesagt nicht sicher, wie Sie würde leicht in eine solche Sache mit C++'s
new
Betreiber - ich glaube, Sie würde haben, um den Speicher für das Objekt mitmalloc()
- und placement -new
. Vielleicht sind einige Klasse/struct bestimmten überlast desoperator new
verwendet werden könnte...Sprache C++ erlaubt das weglassen array-Größe, die nur in nicht-definierenden Deklarationen
Nicht-statisches klassenmitglied decarations sind immer erforderlich, um geben Sie die array-Größe
während statische Klasse Mitglied decarations weglassen können, die Größe
(die definition von dem gleichen Mitglied werden, natürlich haben, um die Größe festzulegen).
Abweichungen von diesem Verhalten kann nur explaind durch erweiterte nicht-standard-Verhalten Ihres Compilers. Vielleicht sollten Sie einige zusätzliche compiler-Einstellungen, um es Verhalten sich in mehr pedantisch Mode.
Einen array-Typ mit nicht angegebener Größe ist unvollständig. 8.3.4/1:
Muss abgeschlossen werden, um die Teilnahme an einer definition, sprich die definition von
a
enthalten muss, eine Größenangabe oder Initialisierung mit array der angegebenen Größe.sizeof
es, aber rechtlich kann man den Zugriff auf seine Elemente.T*
. Es ist ein Zerfall zu einem anderen Typ. Gibt es ein anderes Beispiel, das ich beachten sollte? Ihre Antwort scheint nicht zu zeigen.extern int a[]
Erklärung in deinem Beispiel. Sobald Sie ein array deklarieren, kann man verwenden Sie ist es schon. Ich sehe, Sie entfernt den Verweis auf "verwenden".Wir haben diese verwendet, um eine variable Länge aufzeichnen von einigen Sortieren. So etwas wie eine header-Datei, die Informationen enthält, auf wie viele Strukturen zu Folgen, gefolgt von den Daten selbst. Es ist ein variabler Länge-array und ich habe herausgefunden, dass es nicht unterstützt, auch zwischen den Compilern. Einige wollen, array[]; und einige wollen array[0]; (old-style).