Cosa significa punto (.) In un inizializzatore di strutture?


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

Non capisco bene questa sintassi C. Non riesco nemmeno a cercare perché non conosco il nome della sintassi. Cos'è quello?


Sembra un inizializzatore di strutture.
Mysticial

7
Standardizzato in C99, quindi non funzionerà se hai un compilatore (davvero) vecchio.
Un tizio programmatore l'

2
Finalmente ho trovato il link per questo: stackoverflow.com/questions/330793/...
Mysticial

5
Sfortunatamente, anche le attuali versioni di MSVC sono "(davvero) vecchi compilatori" secondo questo standard.
Jonathan Leffler

Assolutamente bizzarro, ho cercato questa domanda mentre passavo anche attraverso un tutorial sui fusibili e scrivevo esattamente lo stesso inizializzatore.
Keegan Jay

Risposte:


141

Questa è una funzionalità C99 che consente di impostare campi specifici della struttura in base al nome in un inizializzatore. Prima di questo, l'inizializzatore doveva contenere solo i valori, per tutti i campi, in ordine, il che ovviamente funziona ancora.

Quindi per la seguente struttura:

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

...Puoi usare

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

...o:

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

...o anche:

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

... anche se gli ultimi due sono solo per C99.


L'inizializzazione del punto funziona anche in C ++? (Ho bisogno di provarlo)
Gabriel Staples

1
Sembra che lo sia, ma solo per C ++ 20, solo guardando la documentazione. Ecco la documentazione di cppreference.com per C (funziona da C99): en.cppreference.com/w/c/language/struct_initialization e per C ++ (funziona solo per C ++ 20): en.cppreference.com/w/cpp / language / aggregate_initialization .
Gabriel Staples

Nota che ho appena provato questo modulo di tipo "inizializzazione punto" per C ++ usando gcc, e sembra che tutte le versioni di gcc C ++ lo supportino, quindi scommetto che è supportato da gcc come estensione gcc, il che significa che prima di C ++ 20 I sospetto che non sia necessariamente portabile su compilatori non gcc / g ++. Detto questo, però, sto usando i compilatori gcc / g ++ quindi se è supportato da gcc per C ++, potrei anche usarlo.
Gabriel Staples

C'è un potenziale problema nell'inizializzazione del punto (almeno con alcuni compilatori). struct demo_s demo = { .first = 1, .first = 9 };Su uno dei miei GCC questo verrà compilato senza preavviso e il primo sarà 9.
Renate


15

È noto come designated initialisation(vedere Inizializzatori designati ). Un "initializer-list", Each ' .' è un " designator" che in questo caso nomina un particolare membro della struttura " fuse_oprations" da inizializzare per l'oggetto designato hello_operdall'identificatore " ".


0

L'intera sintassi è nota come inizializzatore designato come già menzionato da COD3BOY e viene utilizzata in generale quando è necessario inizializzare la struttura al momento della dichiarazione su alcuni valori specifici o predefiniti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.