¿Qué significa [N… M] en los inicializadores agregados de C?

101

Desde la línea 123 de sys.c :

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

sys_call_tablees un puntero genérico a matrices, puedo ver eso. Sin embargo, cuál es la notación:

[0 ... __NR_syscalls-1]

¿Qué es el ...?


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

Amumu
fuente
2
No, no es un puntero a una matriz, es una matriz de punteros. Se declararía un puntero a una matrizvoid (*sys_call_table)[__NR_syscalls]
Patrick Schlüter
@tristopia tienes razón. Lo que quise decir fue puntero a matrices, similar a char *argv[]. Fijo.
Amumu

Respuestas:

90

Es la inicialización mediante inicializadores designados .

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

Para inicializar un rango de elementos con el 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. Compilar con -pedanticte lo digo.

¿Cómo funciona aquí?
El preprocesador reemplaza #include <asm/unistd.h>con su contenido real ( define diversas constantes y tipos simbólicos, y declara diversas funciones ) en la construcción basada en rango, que luego se utiliza para inicializar la matriz de punteros.

Alok Save
fuente
Parece que esto no es portátil. Es es?
Ivaylo Strandjev
5
@Mehrdad, ¿el compilador de microsoft c cumple con el estándar c99?
Dejo
3
@Mehrdad: En realidad, solo la construcción basada en rango de los inicializadores designados es una extensión de gcc. Los inicializadores designados en sí mismos están permitidos por el estándar C.
Alok Save
2
@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 Save
2
@Mehrdad: Para ser claros, la construcción de rango es portátil solo para gcc (y los 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