Ist das in C gültig?
%Vor% Compiler gibt keinen Fehler bei der Anweisung int a[i];
. Ich bin keine Konstante, dann wie kann es erfolgreich kompilieren? Liegt es daran, dass ich den gcc-Compiler verwende? Ist es in C ++ erlaubt?
Ja, das gilt ab C99 und wird Array variabler Länge (VLA). Mit anderen Worten, es befindet sich seit rund 14 Jahren in einem offiziellen Sprachstandard.
Nein, in C ++ ist es nicht gültig, sehen Sie sich diese Frage an.
Beachten Sie auch, dass sizeof
keine Funktion ist, also als printf("%zu\n", sizeof a);
geschrieben werden kann, die auch den richtigen Formatbezeichner für einen size_t
-Wert verwendet.
Dies ist gültig C99 es heißt Array variabler Länge ( VLA ) gcc
unterstützt VLA als Erweiterung außerhalb von C99 Modus in Bezug auf C ++ beide gcc und clang unterstützen Arrays variabler Länge als Erweiterung, obwohl dies wirklich ein C99 Funktion.
Sie können mit dem -pedantic
-Argument in gcc
und clang
eine Warnung erstellen, die der folgenden ähnelt:
sizeof
korrekt mit VLA funktioniert, obwohl es anstelle einer ganzzahligen Konstante ausgewertet wird. Obwohl Sie undefiniertes Verhalten in Ihrem Code haben, da Sie den falschen Formatbezeichner für size_t
Das ist zu
und nicht d
. Der C99-Entwurfsstandard im Abschnitt 7.19.6.1
Der fprintf Funktion auf die printf
's Abschnitt verweist für den Formatstring Absatz 9 sagt:
Wenn eine Konvertierungsspezifikation ungültig ist, ist das Verhalten nicht definiert. [...]
Ich würde nur die Antwort von unwind hinzufügen, dass es in C ++ 14 Arrays in Laufzeitgröße geben wird, die ziemlich genau so funktionieren wie VLA.
Siehe Kapitel 8.3.4 in N3690 ( array of runtime bound of T
)
Sie scheinen in clang-3.3 (in C ++ 1y-Modus) unterstützt zu werden, aber NICHT in GCC 4.8 (die Unterstützung sollte in GCC 4.9 kommen). Wenn Sie den Code im Pre-C ++ 14-Modus (C ++ 03, C ++ 11) schreiben, wird Ihr Code wahrscheinlich kompiliert, aber es sollte eine Warnung über die Verwendung einer C99-Funktion ausgeben, die nicht in C ++ unterstützt wird.
Und du solltest immer mit den meisten pedantischen Warnungen kompilieren:)