Arrays mit variabler Länge und konstante Ausdrücke
Das unten dargestellte C-Codefragment hat das Potenzial, mit bestimmten Compilern erfolgreich kompiliert zu werden:
int main() { int size = 10; int arr[size]; }
Gemäß dem C-Standard (8.3.4/1) wird dieser Code aufgrund der Größe des Arrays voraussichtlich abgelehnt (arr) muss ein konstanter Ausdruck sein. Es wirft jedoch Fragen zum Verhalten von Compilern wie gcc 4.8 und Clang 3.2 auf.
Variable Length Arrays (VLAs) kommen in diesem Szenario ins Spiel. VLAs sind eine C99-Funktion, die gcc und clang als Erweiterung in C implementiert haben. Allerdings hält sich Visual Studio in diesem Fall strikt an den Standard. Die von ihm generierte Meldung:
error C2466: cannot allocate an array of constant size 0
gibt an, dass die Größe zu Recht als Null interpretiert wird, was in diesem Zusammenhang nicht zulässig ist.
Wenn Sie das Flag -pedantic sowohl in gcc als auch in clang aktivieren erhalten Sie Warnungen bezüglich der Verwendung von VLAs. In gcc heißt es beispielsweise:
warning: ISO C++ forbids variable length array 'arr' [-Wvla] int arr[size]; ^
Darüber hinaus führt die Verwendung des Flags -pedantic-errors dazu, dass diese Verwendung einen Fehler darstellt. Weitere Informationen zu unterstützten Sprachstandards finden Sie in der bereitgestellten Dokumentation.
Der Entwurf des C-Standards definiert einen ganzzahligen konstanten Ausdruck in 5.19 (Konstante Ausdrücke) wie folgt:
"Ein ganzzahliger konstanter Ausdruck ist ein Ausdruck vom Typ einer integralen Aufzählung oder einer Aufzählung ohne Gültigkeitsbereich, der implizit in einen Wert konvertiert wird, wobei der konvertierte Ausdruck ein Kernkonstantenausdruck ist.“
Um die Einhaltung zu erreichen Im Standard können Sie die Größe mithilfe von const (oder constexpr) mit einem Literal initialisieren. Dies würde die Größe zu einem ganzzahligen konstanten Ausdruck machen:
const int size = 10; // or constexpr int size = 10;
Der entsprechende Abschnitt im C99-Standardentwurf (6.7.5.2) stellt klar, dass ein unvollständiger Array-Typ deklariert wird, wenn die Größe nicht vorhanden ist. Wenn die Größe * ist, wird ein Array-Typ variabler Länge ohne definierte Länge erstellt und kann nur in bestimmten Kontexten verwendet werden. Andernfalls handelt es sich entweder um einen regulären Array-Typ oder um einen Array-Typ variabler Länge, basierend auf den Eigenschaften des Ausdrucks.
Das obige ist der detaillierte Inhalt vonWarum erlauben einige Compiler Arrays variabler Länge in C, andere jedoch nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!