Co oznacza kropka (.) W inicjatorze struktury?

118
static struct fuse_oprations hello_oper = {
  .getattr = hello_getattr,
  .readdir = hello_readdir,
  .open    = hello_open,
  .read    = hello_read,
};

Nie rozumiem dobrze tej składni C. Nie mogę nawet wyszukiwać, ponieważ nie znam nazwy składni. Co to jest?

Benzoes
źródło
Wygląda jak inicjator struktury.
Mysticial
7
Standaryzowany w C99, więc nie zadziała, jeśli masz (naprawdę) stary kompilator.
Jakiś programista z
2
Wreszcie znalazłem link do tego: stackoverflow.com/questions/330793/ ...
Mysticial
5
Niestety, nawet obecne wersje MSVC są według tego standardu „(naprawdę) starymi kompilatorami”.
Jonathan Leffler
Absolutnie dziwne, przeszukałem to pytanie, przechodząc również samouczek dotyczący bezpieczników i pisząc dokładnie ten sam inicjalizator.
Keegan Jay

Odpowiedzi:

141

Jest to funkcja C99, która umożliwia ustawienie określonych pól struktury według nazwy w inicjatorze. Wcześniej inicjator musiał zawierać tylko wartości dla wszystkich pól w kolejności - co oczywiście nadal działa.

A więc dla następującej struktury:

struct demo_s {
  int     first;
  int     second;
  int     third;
};

...możesz użyć

struct demo_s demo = { 1, 2, 3 };

...lub:

struct demo_s demo = { .first = 1, .second = 2, .third = 3 };

...lub nawet:

struct demo_s demo = { .first = 1, .third = 3, .second = 2 };

... chociaż ostatnie dwa dotyczą tylko C99.

Dmitri
źródło
Czy inicjalizacja kropki działa również w C ++? (Muszę to przetestować)
Gabriel Staples
1
Wygląda na to, że tak, ale tylko dla C ++ 20, wystarczy spojrzeć na dokumentację. Oto dokumentacja cppreference.com dla C (działa od C99): en.cppreference.com/w/c/language/struct_initialization i dla C ++ (działa tylko dla C ++ 20): en.cppreference.com/w/cpp / język / Agregat_inicjalizacja .
Gabriel Staples,
Zauważ, że właśnie wypróbowałem ten formularz typu "inicjalizacja kropki" dla C ++ przy użyciu gcc i wygląda na to, że wszystkie wersje gcc C ++ go obsługują, więc założę się, że jest obsługiwany przez gcc jako rozszerzenie gcc, co oznacza, że ​​przed C ++ 20 I podejrzewam, że niekoniecznie jest przenośny do kompilatorów innych niż gcc / g ++. Biorąc to pod uwagę, używam kompilatorów gcc / g ++, więc jeśli jest obsługiwany przez gcc dla C ++, równie dobrze mogę go użyć.
Gabriel Staples
Istnieje potencjalny problem z inicjalizacją kropek (przynajmniej w przypadku niektórych kompilatorów). struct demo_s demo = { .first = 1, .first = 9 };Na jednym z moich GCC zostanie to skompilowane bez ostrzeżenia i najpierw będzie to 9.
Renate
15

Jest znany jako designated initialisation(patrz Wyznaczone inicjatory ). „Lista inicjalizacyjna”, „ .” „ ” jest „ designator”, która w tym przypadku nadaje nazwę konkretnemu fuse_oprationselementowi struktury „ ” do zainicjowania obiektu wyznaczonego przez hello_operidentyfikator „ ”.

COD3BOY
źródło
0

Cała składnia jest znana jako wyznaczony inicjator, jak już wspomniano w COD3BOY i jest ogólnie używana, gdy trzeba zainicjować strukturę w momencie deklaracji do pewnych określonych lub domyślnych wartości.

ind79ra
źródło