Pierwszy jest najłatwiejszy ( wymaga mniej wpisywania ) i gwarantuje działanie, wszyscy członkowie będą mieli ustawioną wartość 0
[Ref 1] .
Drugi jest bardziej czytelny.
Wybór zależy od preferencji użytkownika lub tego, który określa Twój standard kodowania.
[Odn. 1] Odniesienie do normy C99 6.7.8.21:
Jeśli na liście w nawiasach klamrowych jest mniej inicjatorów niż elementów lub członków agregatu, lub mniej znaków w literale ciągu używanym do inicjalizacji tablicy o znanym rozmiarze niż elementów w tablicy, pozostała część agregacji powinna być inicjowane niejawnie tak samo jak obiekty, które mają statyczny czas trwania.
Dobry odczyt:
C i C ++: Częściowa inicjalizacja struktury automatycznej
= {};
Jednak nie jestem pewien, czy jest to ważne.foo = {0}
to znaczy. Gdybym zobaczyłfoo = ZERO_FULL
, musiałbym grepować definicję ZERO_FULL.Jeśli dane są zmienną statyczną lub globalną, są domyślnie wypełnione zerami, więc po prostu je zadeklaruj
myStruct _m;
Jeśli dane są lokalną zmienną lub strefą przydzieloną na stertę, wyczyść je za pomocą
memset
:Obecne kompilatory (np. Najnowsze wersje
gcc
) optymalizują to całkiem dobrze w praktyce. Działa to tylko wtedy, gdy wszystkie wartości zerowe (w tym wskaźniki null i zero zmiennoprzecinkowe) są reprezentowane jako wszystkie bity zerowe, co jest prawdą na wszystkich platformach, o których wiem (ale C standard zezwala na implementacje, w których jest to fałszywe; nie znam takiej implementacji) .Możesz być może zakodować
myStruct m = {};
lubmyStruct m = {0};
(nawet jeśli pierwszy element członkowskimyStruct
nie jest skalarem).Mam wrażenie, że użycie
memset
dla struktur lokalnych jest najlepsze i lepiej oddaje fakt, że w czasie wykonywania coś musi być zrobione (podczas gdy zwykle dane globalne i statyczne można rozumieć jako inicjowane w czasie kompilacji, bez żadnych kosztów w czasie wykonywania) .źródło
0
będzie równoważne z zainicjowaniem wszystkich elementów członkowskich struktury za pomocą0
jednak. Na wielu platformach będzie to prawda, ale nie powszechnie.{}
nie jest prawidłowy w C, ale jest dostępny tylko w C ++.NULL
wskaźnik, który nie był tylko0
bitowy: c-faq.com/null/machexamp.html . Istnieje możliwość, że platforma nie używa IEEE 754 do reprezentowania wartości zmiennoprzecinkowych, ale używa innej reprezentacji, która nie ma wartości wszystkich0
bitów0.0
- ale wprawdzie nie znam takiej platformy.Patrz §6.7.9 Inicjalizacja:
Więc tak, oba działają. Zauważ, że w C99 można również zastosować nowy sposób inicjalizacji, zwany inicjalizacją wyznaczoną:
źródło