Heim >Backend-Entwicklung >C++ >Ist „int size = 10;' ein konstanter Ausdruck in C: Ein Compiler-Kompatibilitätsproblem?

Ist „int size = 10;' ein konstanter Ausdruck in C: Ein Compiler-Kompatibilitätsproblem?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-09 22:08:15874Durchsuche

Is `int size = 10;` a Constant Expression in C  : A Compiler Compatibility Issue?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn