que pertenece marcador lista etiqueta estructura documento definicion cuerpo body atributos adónde c syntax linux-kernel

pertenece - ¿Qué es la sintaxis de inicialización de la estructura etiquetada?



que es html (3)

Cuando utiliza inicializadores agregados (inicializadores en {} ) en el lenguaje ANSI C "tradicional" (C89 / 90), debe proporcionar un inicializador individual para cada miembro de la estructura en orden, comenzando con el primero. Por ejemplo

struct S { int a, b, c, d; }; struct S s = { 1, 2, 3, 4 }; /* 1 for `s.a`, 2 for `s.b` and so on... */

No es necesario que especifique inicializadores para todos los miembros, es decir, puede detenerse en cualquier momento (los miembros restantes se inicializarán con cero).

Si por alguna razón solo le importó inicializar explícitamente el tercer miembro de la estructura, tuvo que proporcionar inicializadores explícitos "ficticios" para el primer y el segundo miembro (solo para llegar al tercero deseado)

/* We only care to explicitly initialize `s.c` */ struct S s = { 0, 0, 3 }; /* but we have to explicitly initialize `s.a` and `s.b` as well */

o abandone por completo la inicialización específica (es probable que se reemplace con genérico = { 0 } ) y use una asignación posterior para miembros específicos

struct S s = { 0 }; s.c = 3;

Un beneficio notable de este enfoque basado en la asignación es que es independiente de la posición del miembro c en la declaración de struct S

La nueva especificación del lenguaje C (C99) le permite usar inicializadores "etiquetados" al proporcionar el nombre de miembro deseado dentro de {}

struct S s = { .c = 3 };

De esa manera, solo inicializa explícitamente el miembro (s) deseado (y tiene el compilador para inicializar en cero el resto). Esto no solo le ahorra algo de escritura, sino que también hace que los inicializadores agregados sean independientes del orden en que se especifican los miembros en la declaración del tipo de estructura.

Los inicializadores agregados, como usted probablemente sepa, también se pueden usar con arreglos. Y C99 también admite la inicialización "etiquetada" con matrices. El siguiente ejemplo ilustra cómo se ven las "etiquetas" en caso de una matriz.

int a[10] = { [5] = 3 }; /* `a[5]` is initialized with 3, the rest of `a` is zero-initialized */

Vale la pena señalar una vez más que el lenguaje C continúa apegándose al enfoque de "todo o nada" para la inicialización agregada: si especifica un inicializador explícito para solo uno (o algunos) miembros de una estructura o una matriz, todo el agregado se obtiene se inicializa, y los miembros sin inicializadores explícitos se inicializan en cero.

struct file_operations scull_fops = { .owner = THIS_MODULE, .llseek = scull_llseek, .read = scull_read, .write = scull_write, .ioctl = scull_ioctl, .open = scull_open, .release = scull_release, };

Esta declaración utiliza la sintaxis estándar de inicialización de la estructura etiquetada en C.

¿Alguien puede elaborar?


Estás usando los nombres de los miembros de la estructura para inicializar la estructura. es decir, cada inicialización del miembro está "etiquetada" con el nombre de ese miembro.


Otro beneficio que vale la pena mencionar con respecto a este tipo de inicialización es que permite la reordenación de los miembros de la estructura, lo que en algunos casos puede mejorar el rendimiento, por ejemplo, colocando punteros a los miembros de acceso frecuente en la misma línea de caché de hardware.