statische Arrays mit unspezifizierter Größe, leere Klammern?

7

Für das C ++ - Codefragment unten:

%Vor%

Warum verursacht die Elementvariable auch keinen Fehler? und was bedeutet diese Membervariable?

Ich verwende gcc Version 3.4.5 (mingw-vista special) über CodeBlocks 8.02.

Unter Visual Studio Express 2008 - Microsoft (R) C / C ++, das Compiler 15.00.30729.01 für 80 x 86 optimiert, habe ich die folgenden Nachrichten:

%Vor%

Nun, das braucht auch etwas Erklärung.

    
Ahmed Abdelkader 26.04.2010, 23:28
quelle

4 Antworten

6

C99 unterstützt etwas, das als 'flexibles' Array-Element bezeichnet wird und das letzte Mitglied einer Struktur sein darf. Wenn Sie eine solche Struktur dynamisch zuweisen, können Sie die angeforderte Menge von malloc() erhöhen, um Speicher für das Array bereitzustellen.

Einige Compiler fügen dies als Erweiterung zu C90 und / oder C ++ hinzu.

Sie können also einen Code wie den folgenden haben:

%Vor%

Sie können eine Struktur mit einem flexiblen Array-Member nicht direkt definieren (als lokale oder globale / statische Variable), da der Compiler nicht weiß, wie viel Speicher dafür reserviert werden muss.

Ich bin ehrlich gesagt nicht sicher, wie Sie so etwas mit C ++% new operator verwenden könnten - ich denke, Sie müssten den Speicher für das Objekt mit malloc() zuweisen und das Placement new verwenden. Vielleicht könnte eine gewisse Überlastung von operator new in der Klasse / Struktur verwendet werden ...

    
Michael Burr 26.04.2010, 23:46
quelle
11

Die Sprache C ++ erlaubt das Auslassen der Array-Größe nur in nicht-definierenden Deklarationen

%Vor%

Um die Array-Größe anzugeben, müssen immer nicht-statische Klassenmember dekariert werden.

%Vor%

während statische Klassenmitglieder decarations die Größe weglassen können

%Vor%

(die Definition desselben Mitglieds muss natürlich die Größe angeben).

Jede Abweichung von diesem Verhalten kann nur durch ein erweitertes nicht standardmäßiges Verhalten Ihres Compilers erklärt werden. Vielleicht sollten Sie einige zusätzliche Compiler-Einstellungen angeben, damit sie sich pedantischer verhalten.

    
AnT 27.04.2010 00:04
quelle
2
%Vor%

Ein Array-Typ mit nicht angegebener Größe ist unvollständig. 8.3.4 / 1:

  

Wenn der Konstantenausdruck weggelassen wird, ist der Typ des Bezeichners von D ein "abgeleiteter Deklaratortyp-Listenarray mit unbekannter Grenze von T", ein unvollständiger Objekttyp.

Es muss ausgefüllt werden, um an einer Definition teilzunehmen, dh die Definition von a muss eine Größenspezifikation oder Initialisierung mit einem Array der angegebenen Größe enthalten.

    
Potatoswatter 26.04.2010 23:40
quelle
0

Wir haben dies verwendet, um einen Datensatz variabler Länge zu bezeichnen. So etwas wie eine Header-Datei, die Informationen darüber enthält, wie viele Strukturen folgen sollen, gefolgt von den Daten selbst. Es ist ein Array variabler Länge und ich habe festgestellt, dass es zwischen Compilern nicht gut unterstützt wird. Einige wollen Array []; und einige wollen Array [0]; (alter Stil).

    
Michael Dorgan 27.04.2010 00:01
quelle