Wie wir bereits wissen, VLA (standardisiert in C99) gehören nicht zum Standard in C++.
Der folgende Code ist also “illegal” in C++:
void foo(int n) {
int vla[n];
for (int i = 0; i < n; ++i) {
vla[i] = i;
}
}
Trotzdem ist der Compiler (g++ und klirren++) akzeptiert den Code als gültige Syntax und erzeugt nur a Warnung im Falle -pedantic
Flag ist aktiviert.
ISO C++ verbietet Arrays mit variabler Länge „vla“ [-Wvla]
Meine Fragen sind:
-
Warum akzeptiert der Compiler diese Deklaration?
Der Compiler kann ein Array in welcher Länge nicht einfach ablehnen [is-no-know-at-compile-time]
?
Gibt es eine Art Kompatibilitätssyntaxregel, die befolgt werden muss?
-
Was sagt die Norm dazu?
Aus dem erzeugten Assemblercode sehe ich, dass der Compiler wie ein normales Array in den Stack in der Schleife schreibt, aber ich kann nichts über das Standardverhalten finden.
Warum akzeptiert der Compiler diese Deklaration?
Weil seine Autoren sich dafür entschieden haben.
Insbesondere GCC erlaubt standardmäßig eine Menge Nicht-Standard-Zeug, das historisch von alten C-Compilern akzeptiert wurde. Sie mögen “Kompatibilität” in diesem Sinne.
Was sagt die Norm dazu [it]?
Genau das, was die Warnung besagt, sagt sie darüber aus: ISO C++ verbietet Arrays mit variabler Länge.
C++ hat keine VLAs.
Wo Sie sehen, dass eine akzeptiert wird, handelt es sich um eine Compiler-Erweiterung. Um herauszufinden, wie dieser Compiler eine solche Erweiterung implementiert, müssten Sie die Autoren des Compilers fragen (oder gegebenenfalls seine Quelle untersuchen).
Der Standard verlangt, dass ein konformer Compiler „eine Diagnose ausgeben“ muss, wenn er auf etwas Unzulässiges stößt. Danach steht es Ihnen frei, den Code mit einer implementierungsspezifischen Bedeutung weiter zu kompilieren. (Beachten Sie, dass “mit einer implementierungsspezifischen Bedeutung” eine höfliche Form von “mit undefiniertem Verhalten” ist).
Sie haben zwei Fragen gestellt, nicht eine.
– Leichtigkeitsrennen im Orbit
5. September 2016 um 16:27 Uhr
Compiler-Erweiterungen sind genau das. Erweiterungen.
– StoryTeller – Unslander Monica
5. September 2016 um 16:30 Uhr
„Erzeugt nur eine Warnung für den Fall
-pedantic
Flag ist aktiviert.” – das ist alles-pedantic
Versprechen.-pedantic-errors
macht stattdessen diese Fehler.– Millenniumbug
5. September 2016 um 16:41 Uhr
Bitte verwenden Sie den vollständigen Namen, nicht das Akronym. Es ist nützlicher für die ganze Community, nicht immer professionell
– Jacek Cz
5. September 2016 um 17:38 Uhr
@JacekCz Danke für den Vorschlag, ich habe ihn bearbeitet
– BiagioF
5. September 2016 um 18:05 Uhr