O que ponto (.) Significa em um inicializador de estrutura?

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

Não entendo bem essa sintaxe C. Não consigo nem pesquisar porque não sei o nome da sintaxe. O que é isso?

Benjamin
fonte
Parece um inicializador de estrutura.
Mysticial
7
Padronizado em C99, então não funcionará se você tiver um compilador (realmente) antigo.
Algum programador de
2
Finalmente encontrei o link para isso: stackoverflow.com/questions/330793/…
Mysticial
5
Infelizmente, mesmo as versões atuais do MSVC são 'compiladores (realmente) antigos' por este padrão.
Jonathan Leffler
Absolutamente bizarro, eu pesquisei essa questão enquanto também passava por um tutorial de fusível e escrevia exatamente o mesmo inicializador.
Keegan Jay

Respostas:

141

Este é um recurso do C99 que permite definir campos específicos da estrutura por nome em um inicializador. Antes disso, o inicializador precisava conter apenas os valores, para todos os campos, em ordem - o que ainda funciona, é claro.

Portanto, para a seguinte estrutura:

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

...você pode usar

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

...ou:

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

... ou mesmo:

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

... embora os dois últimos sejam apenas para C99.

Dmitri
fonte
A inicialização de pontos também funciona em C ++? (Eu preciso testá-lo)
Gabriel Staples
1
Parece que sim, mas apenas para C ++ 20, apenas olhando a documentação. Aqui está a documentação de cppreference.com para C (funciona desde C99): en.cppreference.com/w/c/language/struct_initialization , e para C ++ (funciona apenas para C ++ 20): en.cppreference.com/w/cpp / language / aggregate_initialization .
Gabriel Staples
Observe que acabei de experimentar este formulário do tipo "inicialização de ponto" para C ++ usando gcc, e parece que todas as versões do gcc C ++ o suportam, então aposto que é suportado pelo gcc como uma extensão gcc, o que significa que antes de C ++ 20 I suspeito que não seja necessariamente portátil para compiladores não gcc / g ++. Dito isso, estou usando compiladores gcc / g ++, portanto, se ele for compatível com gcc para C ++, também posso usá-lo.
Gabriel Staples
Existe um problema potencial na inicialização de pontos (pelo menos com alguns compiladores). struct demo_s demo = { .first = 1, .first = 9 };Em um dos meus GCC, isso será compilado sem aviso e primeiro será 9.
Renate em
15

É conhecido como designated initialisation(consulte Inicializadores designados ). Uma "lista de inicializadores", Cada ' .' é um " designator" que, neste caso, nomeia um membro específico da fuse_oprationsestrutura ' ' para inicializar para o objeto designado pelo hello_operidentificador ' '.

COD3BOY
fonte
0

A sintaxe inteira é conhecida como inicializador designado conforme já mencionado pelo COD3BOY e é usado em geral quando você precisa inicializar sua estrutura no momento da declaração para alguns valores específicos ou padrão.

ind79ra
fonte