In C ++ habe ich versucht, ein globales Array mit einer bestimmten Größe zu deklarieren. Ich habe den Fehler bekommen:
Array gebunden ist keine Ganzzahlkonstante vor dem Token ']'
Aber wenn ich ein Array des gleichen Typs in der main()
Funktion deklariert habe, funktioniert es einwandfrei.
Warum gibt es hier ein anderes Verhalten?
int y=5;
int arr[y]; //When I comment this line it works fine
int main()
{
int x=5;
int arr2[x]; // This line doesn't show any error.
}
Bearbeiten: Viele schlagen vor, dass diese Frage ein Duplikat des Abrufs des Fehlers "Array gebunden ist keine Ganzzahlkonstante vor ']' Token" ist . Diese Frage beantwortet jedoch nicht, warum es ein anderes Verhalten gibt.
c++
variable-length-array
Syed Maqthyar
quelle
quelle
main
wenn es nicht legal ist, verwendet es die VLA-Erweiterung.main
von Ihrem Compiler "akzeptiert" wird: Sie verwenden die Compiler-Erweiterung, mit der VLAs kompiliert werden können, auch wenn sie vom C ++ - Standard nicht unterstützt werden.y
undx
alsconst
? Müssen Sie den Wert vony
oder ändernx
? Hoffentlich nicht, denn das wirft viele Fragen darüber auf, wie großarr
und wie großarr2
sein sollte - insbesondere in Bezug auf die Initialisierungsreihenfolge. (Hinweis: Sie sollten Konstanten sein)--std=c++17
(oder--std=c++11
wenn es sich um einen älteren Compiler handelt), und die Kompilierung schlägt fehl.Antworten:
Beide Beispiele sind in C ++ schlecht ausgebildet. Wenn ein Compiler letzteres nicht diagnostiziert, entspricht er nicht dem Standard.
Sie verwenden eine Spracherweiterung, die automatische Arrays zur Laufzeitlänge ermöglicht. Ermöglicht jedoch keine statischen Arrays zur Laufzeitlänge. Globale Arrays verfügen über statischen Speicher.
Wenn Sie GCC verwenden, können Sie es mithilfe der Befehlszeilenoption -pedantic auffordern, dem Standard zu entsprechen. Es ist eine gute Idee, dies zu tun, um über Portabilitätsprobleme informiert zu werden.
quelle
Die Größe eines Arrays muss konstant sein. Sie können dies beheben, indem Sie
y
als deklarierenconst
.Aus Gründen, warum dies funktioniert
main
hat, erlaubt g ++ ein Array variabler Länge im Blockbereich als Erweiterung. Es ist jedoch kein Standard-C ++.quelle
Beide sollten nicht verwendet werden, man funktioniert, weil (wie @eerorika sagte) Arrays mit automatischer Länge zur Laufzeit zulässig sind, globale Arrays jedoch statischen Speicher benötigen.
Wenn Sie ein Array mit einer variablen Größe deklarieren möchten (z. B. angegeben durch std :: cin), würden Sie Folgendes tun:
Sie können es jedoch nicht so einstellen, dass es nur Nullen enthält
float arr[n] = {0}
(wenn Sie einen Wert im Array hinzufügen müssen, ohne sicher zu sein, dass Sie ihn festgelegt haben), müssen Sie eine solche Schleife verwendenquelle
Das Typsystem von C ++ behandelt diese C-ähnlichen Arrays auf eine Weise, die es anhand
arr2
Ihres Typbeispiels definiertint[5]
. Ja, die Anzahl der Elemente des Arrays ist Teil des Typs!Dies legt einige Einschränkungen für das fest, was Sie bei der Definition von C-ähnlichen Arrays verwenden dürfen. Das heißt, diese Nummer muss statisch gespeichert sein , unveränderlich sein und zur Kompilierungszeit verfügbar sein .
Vielleicht möchten Sie Ihren Code in etwas wie das Folgende ändern, das einen weiteren Leckerbissen enthält. Das Array wird ordnungsgemäß initialisiert:
quelle