2012-03-29 5 views
6
55 typedef struct pidmap { 
56   atomic_t nr_free; 
57   void *page; 
58 } pidmap_t; 
59 
60 static pidmap_t pidmap_array[PIDMAP_ENTRIES] = 
61   { [ 0 ... PIDMAP_ENTRIES-1 ] = { ATOMIC_INIT(BITS_PER_PAGE), NULL } }; 

el fragmento de código anterior muestra la inicialización de una matriz de un estructuras que se encuentran en el código fuente del núcleo Linux. Nunca antes había visto esta forma de inicialización y no podía simular lo mismo por mi cuenta. ¿Qué me estoy perdiendo en realidad?nunca antes visto método C de la inicialización de una matriz de estructuras que se encuentra en la fuente del núcleo Linux

Source of the code

+3

¿Por qué una etiqueta C++? El kernel de Linux no usa C++. – ThiefMaster

+0

Debería ser una función de extensión. – iammilind

+0

El kernel de Linux usa muchas extensiones específicas de GCC. Ver p. http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/index.html#toc_C-Extensions –

Respuesta

6

Es una extensión GNU/GCC llamada Inicializadores designados. Puede encontrar más información al respecto en el GCC documentation.

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

+2

Solo por precisión, los inicializadores designados no son una extensión de GCC ([ver esta pregunta ] (http://stackoverflow.com/questions/9849719/what-do-square-brackets-mean-in-array-initialization-in-c)), pero la sintaxis de rango es. – huon

5

Se realiza mediante el uso de un Designated Initializer.

Es una construcción gcc y no estándar c. Su uso da como resultado un código no portátil, así que evite usar tales extensiones de compilación a menos que la portabilidad sea lo menos importante.

Cuestiones relacionadas