Ta składnia pozwala zainicjować konkretne elementy tablicy przez indeks. Można użyć wartości int
lub enum
, aby określić, który element tablicy ma zostać zainicjowany. W ten sposób przypisane wartości nie muszą być kolejne.
Jeśli na przykład trzeba było to:
int x[5] = { [2] 3, [4] 7 };
byłoby równoważne to:
int x[5] = { 0, 0, 3, 0, 7 };
W powyższym przykładzie wartości enum określić, które elementy 0 i 1 z tablicy są Zainicjowano na "Init"
i "Serdes Reset"
.
Z sekcji 6.7.8 części C99 standard:
lista
18 Każde oznaczenie zaczyna swój opis z bieżącego obiektu związanego z najbliższej okolicy nawiasów pary. Każda pozycja na liście desygnatorów (w kolejności) określa określonego elementu jej bieżącego obiektu i zmienia bieżący obiekt dla następnego oznacznika (jeśli taki jest) na członka. Bieżący obiekt, który pojawia się na końcu listy desygnatorów, to obiekt podrzędny, który ma zostać zainicjowany przez następujący inicjator.
33 Przykład 9 tablic mogą być inicjowane odpowiadają elementów wyliczenia przez wykorzystaniem oznaczników:
enum { member_one, member_two };
const char *nm[] = {
[member_two] = "member two",
[member_one] = "member one",
};
Edycja:
że składnia od normy zawiera =
chwilę Przykład OP nie. Składnia bez =
jest najwyraźniej starą składnią obsługiwaną przez GCC. Kompilacja przykład OP daje następujące ostrzeżenie:
ostrzeżenie: nieaktualne wykorzystania wyznaczonego inicjatora bez '='
The GCC documentation stwierdza co następuje:
Alternatywną składnię tego, że ma były przestarzałe, ponieważ GCC 2.5, ale GCC nadal akceptuje, to napisać "[indeks]" przed wartością elementu, bez "=".
Prawdopodobnie brakuje ci '=' w swoich inicjalizacjach: '[M_INIT_MSG] =" Init "' itp. Wyszukaj * wyznaczone inicjatory *. –
Nie, nie tęskniłem za tym. Odpowiedź edytowana. – user2162550
Mówienie o standardowym/niestandardowym, a następnie łączenie z rozszerzeniem gcc prawdopodobnie nie jest dobrym pomysłem ... Ale co na dołączonej stronie nie jest jasne? Jest to przestarzałe rozszerzenie gcc, czy nawet czytałeś stronę? Ze strony: "_ Alternatywna składnia tego, co było przestarzałe, odkąd GCC 2.5, ale GCC nadal akceptuje, to napisanie" [index] "przed wartością elementu, bez" = "._" – Olaf