Ich bin relativ neu in C ++ und von Anfang an wurde mir gezeigt, dass man so etwas nicht machen kann
%Vor%Stattdessen müssen Sie dynamischen Speicher verwenden. Jedoch habe ich vor kurzem entdeckt, dass das obige wird kompilieren (obwohl ich eine -pedantische Warnung bekomme, dass es von ISO C ++ verboten ist). Ich weiß, dass es offensichtlich eine schlechte Idee ist, es zu tun, wenn es nicht durch den Standard erlaubt ist, aber ich wusste vorher nicht einmal, dass das möglich war.
Meine Frage ist, warum erlaubt g ++ Arrays variabler Länge, die nicht dynamisch zugewiesen werden, wenn es vom Standard nicht erlaubt ist? Wenn es dem Compiler möglich ist, dies zu tun, warum ist es nicht im Standard?
Die Unterstützung für Arrays variabler Länge (VLAs) wurde der C-Sprache in C99 hinzugefügt.
Da die Unterstützung für sie in gcc existiert (um C99 zu unterstützen), war es wahrscheinlich relativ einfach, Unterstützung für g ++ hinzuzufügen.
Allerdings handelt es sich um eine implementierungsspezifische Spracherweiterung, und es ist keine gute Idee, implementierungsspezifische Erweiterungen zu verwenden, wenn Sie möchten, dass Ihr Code portabel ist.
Weil es in C99 unterstützt wird. Ich kann nicht wirklich sagen, warum es nicht im C ++ - Standard ist. Es ist jedoch nicht so nützlich, wie Sie vielleicht denken, weil es leicht dazu führt (wenn Sie nicht vorsichtig sind), Stack-Überlauf (da es in der Regel basiert auf alloca , selbst nicht Standard). Ein weiterer Fehler besteht darin, einen Zeiger auf ein dynamisches Array zurückzugeben, das sofort den Gültigkeitsbereich verlässt.
Viele Compiler akzeptieren und erweitern Standards. Es gibt zwei grundlegende Gründe:
Alle erwähnten Gründe, die damit zu tun haben, dass sie in C sind, sind korrekt, obwohl es Einschränkungen für die Anforderung gibt. Ihr Beispiel zeigt möglicherweise eine flexiblere Unterstützung als in C erforderlich ist (wenn Sie das mit scanf statt mit cin implementiert haben, in eine .c-Datei einfügen und gcc verwenden).
Dies ist fast nur ein impliziter Aufruf von alloca (allocate auto), der nur den Stack-Pointer verringert (die Stack-Größe erhöht) und den neuen Stack-Pointer in ein anderes Register kopiert, das als Zeiger auf den zugewiesenen Speicher verwendet wird. p>
Der Unterschied ist, dass Konstruktoren und Destruktoren nicht für Objekte aufgerufen werden, die mit einer Zuordnung erstellt wurden.
Tags und Links c++ standards-compliance dynamic-arrays