Heim > Backend-Entwicklung > C++ > Warum erlauben einige Compiler Arrays variabler Länge in C, andere jedoch nicht?

Warum erlauben einige Compiler Arrays variabler Länge in C, andere jedoch nicht?

Patricia Arquette
Freigeben: 2024-12-17 11:05:26
Original
977 Leute haben es durchsucht

Why Do Some Compilers Allow Variable Length Arrays in C   While Others Don't?

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];
}
Nach dem Login kopieren

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
Nach dem Login kopieren

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];
              ^
Nach dem Login kopieren

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;
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage