2012-04-09 15 views
100

De sys.c línea 123:¿Qué significa [N ... M] en los inicializadores agregados C?

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 para arreglos, puedo ver eso. Sin embargo lo que es la notación:

[0 ... __NR_syscalls-1] 

¿Cuál es el ...?


EDIT:
aprendí otro truco C aquí: #include <asm/unistd.h> habrá procesados ​​previamente y se sustituye con su contenido y asigna a [0 ... _NR_syscalls-1].

+2

No, no es un puntero a una matriz, es una matriz de punteros. Un puntero a una matriz se declararía 'void (* sys_call_table) [__ NR_syscalls]' –

+0

@tristopia, tienes razón. Lo que quise decir fue puntero a matrices, similar a 'char * argv []'. Fijo. – Amumu

Respuesta

90

Es la inicialización usando Designated Initializers.

La inicialización basada en el 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 de GNU. Por ejemplo,

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

No es portátil. Compilando con -pedantic con se lo diga.

¿Cómo funciona aquí?
El preprocesador reemplaza #include <asm/unistd.h> con sus contenidos reales (define constantes y tipos misceláneos, y declara funciones misceláneas) en la construcción basada en rango, que luego se utilizan para inicializar la matriz de punteros.

+0

Parece que esto no es portátil. Es es? –

+5

@Mehrdad ¿el compilador de microsoft c cumple con el estándar c99? Descanso mi caso aquí ... [c99] (http://en.wikipedia.org/wiki/C99) – Aftnix

+3

@Mehrdad: en realidad, solo el constructo basado en rango de los inicializadores designados es una extensión de gcc. Se permiten los inicializadores designados por el estándar C –

Cuestiones relacionadas