Die erste ist am einfachsten ( erfordert weniger Eingabe ) und funktioniert garantiert. Alle Mitglieder werden auf 0
[Ref. 1] gesetzt .
Der zweite ist besser lesbar.
Die Auswahl hängt von den Benutzerpräferenzen oder denen ab, die Ihr Codierungsstandard vorschreibt.
[Ref 1] Referenz C99 Standard 6.7.8.21:
Wenn eine Liste in Klammern weniger Initialisierer enthält als Elemente oder Elemente eines Aggregats oder weniger Zeichen in einem Zeichenfolgenliteral, das zum Initialisieren eines Arrays bekannter Größe verwendet wird, als Elemente im Array vorhanden sind, muss der Rest des Aggregats implizit wie Objekte mit statischer Speicherdauer initialisiert werden.
Gut gelesen:
C und C ++: Teilinitialisierung der automatischen Struktur
= {};
jedoch. Ich bin mir jedoch nicht sicher, ob dies gültig ist.foo = {0}
bedeutet. Wenn ich sehen würdefoo = ZERO_FULL
, müsste ich nach der Definition von ZERO_FULL suchen.Wenn es sich bei den Daten um statische oder globale Variablen handelt, werden sie standardmäßig mit Nullen gefüllt. Deklarieren Sie sie einfach
myStruct _m;
Wenn es sich bei den Daten um eine lokale Variable oder eine vom Heap zugewiesene Zone handelt, löschen Sie sie
memset
wie folgt :Aktuelle Compiler (zB neuere Versionen von
gcc
) optimieren dies in der Praxis recht gut. Dies funktioniert nur, wenn alle Nullwerte (einschließlich Nullzeiger und Gleitkomma-Null) als alle Nullbits dargestellt werden, was auf allen mir bekannten Plattformen zutrifft (aber der C- Standard erlaubt Implementierungen, bei denen dies falsch ist; ich kenne keine solche Implementierung). .Sie könnten vielleicht codieren
myStruct m = {};
odermyStruct m = {0};
(auch wenn das erste Mitglied vonmyStruct
kein Skalar ist).Meiner Meinung nach ist die Verwendung
memset
für lokale Strukturen die beste und vermittelt besser die Tatsache, dass zur Laufzeit etwas getan werden muss (während globale und statische Daten normalerweise als zur Kompilierungszeit initialisiert verstanden werden können, ohne dass zur Laufzeit Kosten anfallen). .quelle
0
dem Initialisieren aller Strukturelemente mit entspricht0
. Auf vielen Plattformen wird dies zutreffen, aber nicht universell.{}
kein gültiges C, sondern nur in C ++ verfügbar.NULL
Zeiger, der nicht nur aus0
Bits besteht: c-faq.com/null/machexamp.html . Und dann besteht die Möglichkeit, dass die Plattform nicht IEEE 754 zur Darstellung von Gleitkommawerten verwendet, sondern eine andere Darstellung, die keinen All-0
Bit-0.0
Wert hat - aber ich kenne zugegebenermaßen keine solche Plattform.Siehe §6.7.9 Initialisierung:
Also ja, beide arbeiten. Beachten Sie, dass in C99 auch eine neue Art der Initialisierung verwendet werden kann, die als designierte Initialisierung bezeichnet wird:
quelle