Heim >Backend-Entwicklung >C++ >Ist „int size = 10;' ein konstanter Ausdruck in C: Ein Compiler-Kompatibilitätsproblem?
Tut „int size = 10;“ Einen konstanten Ausdruck liefern?
Der folgende Codeausschnitt wird erfolgreich in gcc 4.8 und Clang 3.2 kompiliert:
int main() { int size = 10; int arr[size]; }
Gemäß dem C-Standard (8.3.4/1) wird der Die Größe eines Arrays muss ein ganzzahliger konstanter Ausdruck sein. Es scheint jedoch, dass „Größe“ im Code kein ganzzahliger konstanter Ausdruck ist. Handelt es sich hierbei um einen Compilerfehler oder um ein Versehen nach unserem Verständnis?
Visual Studio C lehnt diesen Code mit der Meldung ab: „Fehler C2466: Es kann kein Array mit konstanter Größe 0 zugewiesen werden“. Dies impliziert, dass der Compiler „Größe“ als Null ansieht.
Erklärung
gcc und Clang unterstützen Variable-Length-Arrays (VLA) als Erweiterung in C . VLA ist eine C99-Funktion, mit der die Größe eines Arrays zur Laufzeit bestimmt werden kann. Im Codeausschnitt wird „Größe“ zur Kompilierzeit bestimmt, es handelt sich jedoch nicht um eine Literalkonstante. Daher wird „Größe“ in gcc und Clang als VLA betrachtet.
Visual Studio hingegen unterstützt VLA nicht und hält sich an den C-Standard. Infolgedessen wird der Code abgelehnt, da „Größe“ keine Literalkonstante ist.
Standardkonformität
Der C-Standard definiert einen integralen Konstantenausdruck als Ausdruck, der bei Auswertung einen Wert vom Typ „Integral“ oder „Unscoped“ ergibt. In diesem Fall wird „size“ mit einem Literalwert (10) initialisiert, was es zu einem ganzzahligen konstanten Ausdruck macht.
Die Verwendung des Flags „-pedantic“ in gcc und Clang generiert eine Warnung zu Arrays variabler Länge im Codeausschnitt. Durch die Verwendung von „-pedantic-errors“ wird die Warnung zu einem Fehler.
Lösung
Um dem C-Standard zu entsprechen, kann „size“ als const oder deklariert werden constexpr Ganzzahl:
const int size = 10;
oder
constexpr int size = 10;
Das obige ist der detaillierte Inhalt vonIst „int size = 10;' ein konstanter Ausdruck in C: Ein Compiler-Kompatibilitätsproblem?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!