Que hace [ N … M ] significa en C inicializadores agregados?

2 minutos de lectura

Que hace N M significa en C inicializadores
Amumu

Desde sys.c línea 123:

void *sys_call_table[__NR_syscalls] = 
{
    [0 ... __NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};

sys_call_table es un puntero genérico a matrices, puedo verlo. Sin embargo, ¿cuál es la notación:

[0 ... __NR_syscalls-1]

Cuál es el ...?


EDITAR:

Aprendí otro truco de C aquí: #include <asm/unistd.h> sera preprocesado y reemplazado con su contenido y asignado a [0 ... _NR_syscalls-1].

  • No, no es un puntero a una matriz, es una matriz de punteros. Se declararía un puntero a una matriz. void (*sys_call_table)[__NR_syscalls]

    – Patrick Schlüter

    10 de abril de 2012 a las 14:34


  • @tristopia tienes razón. Lo que quise decir fue puntero a matrices, similar a char *argv[]. Reparado.

    – Amumu

    10 de abril de 2012 a las 14:48

Que hace N M significa en C inicializadores
Guardar

Es inicialización usando Inicializadores designados.

La inicialización basada en rango es una extensión gnu gcc.

Para inicializar un rango de elementos al mismo valor, escriba [first ... last] = value. Esta es una extensión GNU. Por ejemplo,

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

No es portátil. Compilando con -pedantic con decírtelo.

¿Cómo funciona aquí?

El preprocesador reemplaza #include <asm/unistd.h> con su contenido real (define tipos y constantes simbólicas misceláneas, y declara funciones misceláneas) en la construcción basada en rango, que luego se usan para inicializar la matriz de punteros.

  • Parece que esto no es portátil. es es?

    – Ivailo Strandjev

    9 de abril de 2012 a las 9:32

  • @Mehrdad, ¿el compilador de microsoft c cumple con el estándar c99? Descanso mi caso aquí…c99

    – Afnix

    9 de abril de 2012 a las 9:37


  • @Mehrdad: En realidad, solo la construcción basada en rango de Inicializadores designados es una extensión gcc. El estándar C permite los Inicializadores designados.

    – Alok Guardar

    9 de abril de 2012 a las 9:38


  • @Mehrdad: Lo siento, no deseo ser parte de ningún cebo de llamas, mi intención era solo aclarar un detalle sutil que pensé que no entendiste.

    – Alok Guardar

    9 de abril de 2012 a las 9:42

  • @Mehrdad: para ser claros, la construcción de rango es portátil solo para gcc (y compiladores que implementan sus extensiones), y los inicializadores designados en general son portátiles solo para compiladores que admiten C99 (o al menos esa característica en particular).

    –Keith Thompson

    10 de abril de 2012 a las 7:39

¿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