¿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].


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.