VS2008 Fehler erwartet Konstante Ausdruck zur Deklaration von array -, aber kein Fehler für Sie diesen code in GCC
Habe ich folgende Funktion
void someFun(int* ar, const int size) {
int newAr[size];
//do something
}
Und ich bekomme für diese Zeile drei Fehler:
Error 1 error C2057: expected constant expression
Error 2 error C2466: cannot allocate an array of constant size 0
Error 3 error C2133: 'newAr' : unknown size
Aber var Größe ist konstant! Und mit gcc kompiliert, ohne Fehler. Können Sie mir sagen, was und warum falsch ist, hier für vs2008(oder für Visual C++ im Allgemeinen vielleicht)? Vielen Dank im Voraus.
- Um Ihre Frage zu beantworten, es ist eine compiler-Erweiterung, bis C++14 wird standardisiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
size
ist nicht ein konstanter Ausdruck. Der Begriff "konstanter Ausdruck" in der Fehlermeldung bezieht sich auf die C++ - Konzept der Integralen Konstanten Ausdruck. Die ganze Idee der Integralen Konstanten Ausdrucks ist dessen Wert zum Zeitpunkt der Kompilierung bekannt. Zum Beispiel, ein integralerconst
Objekt deklariert mit einem Initialisierer kann verwendet werden, als ein Integraler Konstanter Ausdruck.Nur weil Sie erklärt einige
int
variableconst
nicht schalten Sie ihn in ein Integraler Konstanter Ausdruck. Funktion Parameter bilden niemals Integrale Konstante Ausdrücke. Dies ist der Grund, warum Sie nicht verwenden können Sie Ihresize
zu definieren, die array-Größe in C++.GCC kompiliert den code, denn er bringt über eine C-spezifische Funktion von C die Sprache C++ als eine nicht-standard-Erweiterung. Beachten Sie, dass in den GCC-Ihre
size
ist nicht als Konstante entweder. GCC einfach nicht verlangen, array-Größen konstant sein.Wenn Sie schalten Sie Ihren GCC-compiler in eine strenge und pedantische C++ - Modus, es wird sich weigern, Ihren code kompilieren nur als MSVC++ tut.
Die Größe eines statischen Arrays muss zum Zeitpunkt der Kompilierung bekannt (daher kann es keine Variablen, die const-Schlüsselwort bedeutet, dass die variable nicht geändert werden kann aber nicht bedeuten das die variable ist konstant über die gesamte Länge des Programms und viel weniger bekannt, zur compile-Zeit). Haben Sie etwas wie das hier tun:
oder noch besser: verwenden Sie einen Vektor:
Der Grund, warum ich schlage vor, Vektor über die dynamische Zuweisung von Arrays, die mit dem array, das Sie haben sich daran zu erinnern freigeben der Speicher, sobald Sie fertig sind oder sonst werden Sie undicht wird es. Mit der vector aber, es zu verwalten, es ist das eigene Gedächtnis.
Erhalten Sie zusätzliche Informationen über Vektoren hier. Ich sehr empfehlen Sie Lesen, auf Ihnen, Sie sind sehr nützlich und sind in meinem Fall die ersten container, die ich erreichen für die meisten der Zeit.
P. S: Wie chris erwähnt, der Grund ging in den gcc ist, weil gcc hat die Fähigkeit, dies zu tun für eine Weile, aber es ist eine nicht-standard-Erweiterung und daher nicht tragbar. Zum Glück, ich glaube, dass es eingegeben worden ist, in der C++14-standard-Entwurf was bedeutet, dass schon bald die meisten/alle Compiler unterstützen es.
Den parameter
const int size
bedeutet nicht, dasssize
ist compile-time Konstanten. Es bedeutet einfach, dass insomeFun
können Sie nicht ändern Sie den Wert vonsize
. Allerdings ist der Wert dersize
geändert werden kann zwischen verschiedenen aufrufen vonsomeFun
.Arrays in C/C++ brauchen, um eine Größe bekannt ist, dass zur compile-Zeit.