Que signifie dot (.) Dans un initialiseur de structure?

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

Je ne comprends pas bien cette syntaxe C. Je ne peux même pas rechercher parce que je ne connais pas le nom de la syntaxe. Qu'est-ce que c'est?

Benjamin
la source
Cela ressemble à un initialiseur de structure.
Mysticial
7
Standardisé en C99, donc ne fonctionnera pas si vous avez un (vraiment) vieux compilateur.
certain programmeur du
2
Enfin trouvé le lien pour cela: stackoverflow.com/questions/330793/…
Mysticial
5
Malheureusement, même les versions actuelles de MSVC sont de «(vraiment) vieux compilateurs» selon ce standard.
Jonathan Leffler
Absolument bizarre, j'ai cherché cette question tout en parcourant un didacticiel sur les fusibles et en écrivant exactement le même initialiseur.
Keegan Jay

Réponses:

142

Il s'agit d'une fonctionnalité C99 qui vous permet de définir des champs spécifiques de la structure par nom dans un initialiseur. Avant cela, l'initialiseur devait contenir uniquement les valeurs, pour tous les champs, dans l'ordre - ce qui fonctionne toujours, bien sûr.

Donc pour la structure suivante:

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

...vous pouvez utiliser

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

...ou:

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

...ou même:

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

... bien que les deux derniers ne concernent que le C99.

Dmitri
la source
L'initialisation des points fonctionne-t-elle également en C ++? (J'ai besoin de le tester)
Gabriel Staples
1
Il semble que ce soit le cas, mais uniquement pour C ++ 20, en regardant simplement la documentation. Voici la documentation de cppreference.com pour C (fonctionne depuis C99): en.cppreference.com/w/c/language/struct_initialization , et pour C ++ (fonctionne uniquement pour C ++ 20): en.cppreference.com/w/cpp / language / aggregate_initialization .
Gabriel Staples
Notez que je viens d'essayer ce formulaire de type "initialisation par point" pour C ++ en utilisant gcc, et il semble que toutes les versions de gcc C ++ le prennent en charge, donc je parie qu'il est pris en charge par gcc en tant qu'extension gcc, ce qui signifie qu'avant C ++ 20 je soupçonnez qu'il n'est pas nécessairement portable pour les compilateurs non-gcc / g ++. Cela étant dit, cependant, j'utilise des compilateurs gcc / g ++, donc s'il est pris en charge par gcc pour C ++, je pourrais aussi bien l'utiliser.
Gabriel Staples
Il y a un problème potentiel dans l'initialisation des points (au moins avec certains compilateurs). struct demo_s demo = { .first = 1, .first = 9 };Sur l'un de mes GCC, celui-ci sera compilé sans avertissement et le premier sera 9.
Renate le
15

Son connu sous le nom de designated initialisation(voir Initialiseurs désignés ). Une "liste d'initialisation", Chaque ' .' est un " designator" qui dans ce cas nomme un membre particulier de la fuse_oprationsstructure ' ' à initialiser pour l'objet désigné par l' hello_operidentificateur ' '.

COD3BOY
la source
0

L'ensemble de la syntaxe est appelé initialiseur désigné comme déjà mentionné par COD3BOY et il est utilisé en général lorsque vous devez initialiser votre structure au moment de la déclaration à certaines valeurs spécifiques ou par défaut.

ind79ra
la source