¿Qué significa punto (.) En un inicializador de estructura?

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

No entiendo bien esta sintaxis C. Ni siquiera puedo buscar porque no sé el nombre de la sintaxis. ¿Que es eso?

Benjamín
fuente
Parece un inicializador de estructura.
Mysticial
7
Estandarizado en C99, por lo que no funcionará si tiene un compilador (realmente) antiguo.
Un tipo programador
2
Finalmente encontré el enlace para esto: stackoverflow.com/questions/330793/…
Mysticial
5
Desafortunadamente, incluso las versiones actuales de MSVC son '(realmente) compiladores antiguos' según este estándar.
Jonathan Leffler
Absolutamente extraño, busqué esta pregunta mientras seguía un tutorial de fusibles y escribía exactamente el mismo inicializador.
Keegan Jay

Respuestas:

141

Esta es una característica de C99 que le permite establecer campos específicos de la estructura por nombre en un inicializador. Antes de esto, el inicializador necesitaba contener solo los valores, para todos los campos, en orden, lo que todavía funciona, por supuesto.

Entonces, para la siguiente estructura:

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

...puedes usar

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

...o:

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

...o incluso:

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

... aunque los dos últimos son solo para C99.

Dmitri
fuente
¿La inicialización de puntos también funciona en C ++? (Necesito probarlo)
Gabriel Staples
1
Parece que sí, pero solo para C ++ 20, con solo mirar la documentación. Aquí está la documentación de cppreference.com para C (funciona desde C99): en.cppreference.com/w/c/language/struct_initialization , y para C ++ (solo funciona para C ++ 20): en.cppreference.com/w/cpp / language / aggregate_initialization .
Gabriel Staples
Tenga en cuenta que acabo de probar este formulario de tipo "inicialización de puntos" para C ++ usando gcc, y parece que todas las versiones de gcc C ++ lo admiten, así que apuesto a que es compatible con gcc como una extensión de gcc, lo que significa que antes de C ++ 20 yo Sospecho que no es necesariamente portable a compiladores que no sean gcc / g ++. Sin embargo, dicho esto, estoy usando compiladores gcc / g ++, por lo que si es compatible con gcc para C ++, también podría usarlo.
Gabriel Staples
Existe un problema potencial en la inicialización de puntos (al menos con algunos compiladores). struct demo_s demo = { .first = 1, .first = 9 };En uno de mis GCC, esto se compilará sin previo aviso y primero será el 9.
Renate
15

Se conoce como designated initialisation(consulte Inicializadores designados ). Una "lista de inicializadores", cada ' .' es un " designator" que en este caso nombra a un miembro particular de la fuse_oprationsestructura ' ' para inicializar el objeto designado por el hello_operidentificador ' '.

COD3BOY
fuente
0

Toda la sintaxis se conoce como inicializador designado como ya lo mencionó COD3BOY y se usa en general cuando necesita inicializar su estructura en el momento de la declaración a algunos valores específicos o predeterminados.

ind79ra
fuente