¿Qué es un inicializador designado en C?

4 minutos de lectura

avatar de usuario
usuario7349461

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?

  • 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

avatar de usuario
Betsabé

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).

  • Echa un vistazo a esta para leer más sobre C++. Creo que está bien establecido para el próximo estándar.

    – Dei Dei

    9 de noviembre de 2017 a las 13:10


  • @AnttiHaapala: Necesito desenterrar mi estándar para mi comentario final antes de la línea marcada. (Por desgracia, estoy en el choo choo). I pensar es correcto.

    – Betsabé

    9 de noviembre de 2017 a las 13:27

  • port70.net/~nsz/c/c11/n1570.html#6.7.9p9 al menos los miembros de la estructura sin nombre no están inicializados.

    – Antti Haapala — Слава Україні

    9 de noviembre de 2017 a las 13:29

  • Los miembros (de la variable) que no se inicializan explícitamente en el código serán automáticamente inicializados por el compilador a 0. Al igual que todas las variables estáticas y globales, siempre se inicializan automáticamente a 0 cuando no se hace explícitamente en el código.

    – abetancort

    26 de junio de 2020 a las 12:49


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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad