Sé que esto podría ser una pregunta básica.
Tengo una tarea que requiere que comprenda qué son los inicializadores designados en C y qué significa inicializar una variable con uno.
No estoy familiarizado con el término y no pude encontrar ninguna definición concluyente.
¿Qué es un inicializador designado en C?
Los inicializadores designados vienen en dos sabores:
1) Proporciona una forma rápida de inicializar elementos específicos en una matriz:
int foo[10] = { [3] = 1, [5] = 2 };
configurará todos los elementos para foo
a 0, excepto el índice 3 que se establecerá en 1 y el índice 5 que se establecerá en 2.
2) Proporciona una forma de inicializar explícitamente struct
miembros por ejemplo, para
struct Foo { int a, b; };
puedes escribir
struct Foo foo { .a = 1, .b = 2 };
Tenga en cuenta que, en este caso, los miembros que no se inicializan explícitamente se inicializan como si la instancia hubiera static
duración.
Ambos son C estándar, pero tenga en cuenta que C ++ tampoco es compatible (ya que los constructores pueden hacer el trabajo en ese idioma).
El Inicializador diseñado surgió desde ISO C99 y es una forma diferente y más dinámica de inicializar en C al inicializar struct
, union
o un array
.
La mayor diferencia con la inicialización estándar es que no tiene que declarar los elementos en un orden fijo y también puede omitir el elemento.
Desde el Guía GNU:
El estándar C90 requiere que los elementos de un inicializador aparezcan en un orden fijo, el mismo que el orden de los elementos en la matriz o estructura que se inicializa.
En ISO C99 puede dar los elementos en orden aleatorio, especificando los índices de matriz o los nombres de campo de estructura a los que se aplican, y GNU C también permite esto como una extensión en el modo C90
Ejemplos
1. Índice de matriz
Inicialización estándar
int a[6] = { 0, 0, 15, 0, 29, 0 };
Inicialización diseñada
int a[6] = {[4] = 29, [2] = 15 }; // or
int a[6] = {[4]29 , [2]15 }; // or
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
2. Estructura o unión:
Inicialización estándar
struct point { int x, y; };
Inicialización diseñada
struct point p = { .y = 2, .x = 3 }; or
struct point p = { y: 2, x: 3 };
3. Combine los elementos de denominación con la inicialización ordinaria de C de elementos sucesivos:
Inicialización estándar
int a[6] = { 0, v1, v2, 0, v4, 0 };
Inicialización diseñada
int a[6] = { [1] = v1, v2, [4] = v4 };
4. Otros:
Etiquetado de los elementos de un inicializador de matriz
int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };
escribe una serie de ‘.fieldname’ y ‘[index]’ designadores antes de un ‘=’ para especificar un subobjeto anidado para inicializar
struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };
Guías
mira aquí gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Designated-Inits.html
– CIsParaCookies
9 de noviembre de 2017 a las 13:05
Voto para cerrar esta pregunta como fuera de tema porque no se realizó una investigación seria.
– chux – Reincorporar a Monica
9 de noviembre de 2017 a las 13:09
Sin embargo, @chux negativo, estaba buscando un duplicado para eso pero no pude encontrar uno, solo algunos que muestran cómo inicializar cualquiera una matriz o una estructura, pero ni siquiera ambas.
– Antti Haapala — Слава Україні
9 de noviembre de 2017 a las 13:19
Se supone que @chux SO es un repositorio de respuestas de alta calidad a preguntas relevantes, ¿verdad? Como sucedió, I Tenía esta pregunta hoy y estaba feliz de encontrar la respuesta concisa de Betsabé, en un lugar en el que puedo confiar. (Sí, debería tener mi propia copia del estándar C11, pero, lamentablemente, no la tengo. Y de todos modos, los estándares no siempre son los mejores lugares para que los simples mortales encuentren respuestas, por lo que una pregunta y una respuesta aquí parecen perfectamente apropiado.)
– Steve cumbre
3 de julio de 2018 a las 17:37
Acabo de ver a Jason explicándolo aquí en el canal C++ Weekly youtube.com/watch?v=44rs_hX1dxE
– Tien Do
19 de diciembre de 2018 a las 1:02