Cuando usa los 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 por 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 especificar inicializadores para todos los miembros, es decir, se puede parar en cualquier momento (los miembros restantes serán inicializado a cero).
Si por alguna razón que sólo se preocupaba para inicializar explícitamente el tercer miembro de la estructura, que tenía que suministrar inicializadores explícitas "dummy" para el primer y segundo miembros (sólo para llegar a la tercera deseada)
/* 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 abandonar inicialización específica por completo (probablemente su sustitución por genérico = { 0 }
) y utilizar una asignación posterior a miembros específicos
struct S s = { 0 };
s.c = 3;
una ventaja notable de este enfoque basado en la asignación es que es independiente desde la posición del miembro c
en la declaración de struct S
.
La nueva especificación del lenguaje C (C99) le permite utilizar inicializadores "etiqueta" suministrando el nombre del miembro deseado dentro del {}
struct S s = { .c = 3 };
De esta manera sólo se inicializa explícitamente el miembro (s) deseada (y tener el compilador para inicializar a cero el resto). Esto no solo le ahorra algo de tipeo, sino que también hace que los inicializadores agregados sean independientes del orden en que se especifican los miembros en la declaración de tipo de estructura.
Los inicializadores agregados, como probablemente sepa, se pueden usar con arreglos, también. Y C99 también admite la inicialización "etiquetada" con matrices. El aspecto de "etiquetas" en el caso de una matriz se ilustra con el siguiente ejemplo
int a[10] = { [5] = 3 };
/* `a[5]` is initialized with 3, the rest of `a` is zero-initialized */
Cabe destacar una vez más que el lenguaje C sigue a pegarse al enfoque de "todo o nada" para agregar inicialización: si especifica un inicializador explícito para solo uno (o algunos) miembros de una estructura o una matriz, todo el agregado se inicializa y los miembros sin inicializadores explícitos se inicializan en cero.
Estoy leyendo el mismo libro –
Estoy leyendo el mismo libro en – Lewisou
Estoy leyendo el mismo libro :) –