Array-Fehler
-
Skym0sh0 schrieb:
array_1 schrieb:
kann muss aber nicth
Nein
Doch. Hast du ihn missverstanden?
-
Kommt drauf an, ob es sich um eine globale oder lokale Variable handelt - nur globale werden auf 0 gesetzt.
-
Th69 schrieb:
Kommt drauf an, ob es sich um eine globale oder lokale Variable handelt - nur globale werden auf 0 gesetzt.
Was aber auf keinen Fall als Aufforderung verstanden werden sollte, globale Variablen zu nutzen
-
Wenn man gerne ein lokales auf 0 initialisiertes Array haben möchte kann man das einfach so machen:
int array[10] = {};
-
Das ist ein Syntaxfehler, also Müll.
-
Wutz schrieb:
Das ist ein Syntaxfehler
Was?
-
Falls das von sebi707 gemeint ist, ich schreib das auch immer so. Sowohl bei Arrays als auch bei structs.
-
hustbaer schrieb:
Falls das von sebi707 gemeint ist, ich schreib das auch immer so. Sowohl bei Arrays als auch bei structs.
Ich auch. Ich glaub' Wutz ist nicht ganz bei Sinnen, denn der Code ist sowohl gültiges C++ als auch C.
-
Arcoth schrieb:
Ich auch. Ich glaub' Wutz ist nicht ganz bei Sinnen, denn der Code ist sowohl gültiges C++ als auch C.
Stimmt leider nicht. In C kann man das so nicht machen, da muss man
int array[10] = {0};
schreiben.
-
GCC scheint etwas anderes zu behaupten. Eine Erweiterung? Du hast nämlich Recht, die Grammatik in §6.7.9/1 ist eindeutig dagegen.
-
Mit
-pedantic
ist GCC auch dagegen:warning: ISO C forbids empty initializer braces [-Wpedantic]
-
Ja, damit ist die Erweiterung weg. Warum werden leere Listen nicht erlaubt?
-
Arcoth schrieb:
Ja, damit ist die Erweiterung weg. Warum werden leere Listen nicht erlaubt?
Weil dafür keine Notwendigkeit besteht? Aggregate haben in C immer mindestens ein Element, das stellt dort daher keine Beschränkung dar. In C++ gibt es ja aber bekanntlich auch leere Klassen, und für die musste die Syntax entsprechend angepasst werden.
-
camper schrieb:
Arcoth schrieb:
Ja, damit ist die Erweiterung weg. Warum werden leere Listen nicht erlaubt?
Weil dafür keine Notwendigkeit besteht?
Was, wenn ich ein Array einfach ausnullen will? Ist
{0}
etwa aussagekräftiger?
-
In C++ gibt es ja aber bekanntlich auch leere Klassen, und für die musste die Syntax entsprechend angepasst werden.
Wirklich? Leere Aggregate kann ich einfach per Zuweisung einer entsprechenden Temporary mit der effektiv gleichen Semantik initialisieren. Der triviale Default-Konstruktor existiert bei Aggregaten schließlich unbedingt. Und Ästhetik ist zwar ein Argument, aber bei leeren Aggregaten brauchen wir prinzipiell überhaupt keinen Initializer, denn wenn ich ausgenulltes Padding will, hätte ich einfach einen
char
-Member verpassen können und{0}
verwenden, wie in C. So brauch' ich nicht einmal mehr Aliasing um das Byte zu lesen.Der Hauptgrund muss ein anderer gewesen sein; Ich tippe mal auf Ästhetik in Beispielen wie diesem:
struct A {std::string s; /* … mehr Member… */ } a = {}; // (1)
Um für (1) (in C++03) den gewünschten Effekt ohne leere Listen zu erzielen müsste ich entweder
A
einen Konstruktor verpassen, was eine ziemlich fragwürdige Option ist, daA
so kein Aggregat mehr wäre - oder ich hau' die Initializer rein, was hässlich ist ({std::string()}
) und zudem den Initializer Typ-Abhängig vom Member macht. (Wohlgemerkt,{""}
hätte nicht die gleiche Semantik und könnte ineffizienter sein(?), ich hätte aber auch einen Typen nennen können der keine kurzen Initializer hat).In C++ ist ein Aggregat nämlich nicht zwangsläufig ein ausschließlich aus Aggregaten zusammengesetzter Typ, weswegen
{0}
auch nicht zwangsläufig funktioniert.