2010-06-10 30 views
39
struct file_operations scull_fops = { 
.owner = THIS_MODULE, 
.llseek = scull_llseek, 
.read = scull_read, 
.write = scull_write, 
.ioctl = scull_ioctl, 
.open = scull_open, 
.release = scull_release, 
}; 

Esta declaración utiliza el C estructura etiquetados sintaxis estándar de inicialización .¿Qué es la sintaxis de inicialización de estructura etiquetada?

¿Puede alguien elaborar?

+4

Estoy leyendo el mismo libro –

+1

Estoy leyendo el mismo libro en – Lewisou

+0

Estoy leyendo el mismo libro :) –

Respuesta

4

Está utilizando los nombres de los miembros de la estructura para inicializar la estructura. es decir, cada inicialización de miembro está "etiquetada" con el nombre de ese miembro.

69

Cuando usa los inicializadores agregados (inicializadores en {}) en el lenguaje ANSI C "tradicional" (C89/90), debe proporcionar un inicializador individual para cada miembro de la estructura en orden, comenzando por el primero. Por ejemplo

struct S { int a, b, c, d; }; 

struct S s = { 1, 2, 3, 4 }; 
/* 1 for `s.a`, 2 for `s.b` and so on... */ 

No es necesario especificar inicializadores para todos los miembros, es decir, se puede parar en cualquier momento (los miembros restantes serán inicializado a cero).

Si por alguna razón que sólo se preocupaba para inicializar explícitamente el tercer miembro de la estructura, que tenía que suministrar inicializadores explícitas "dummy" para el primer y segundo miembros (sólo para llegar a la tercera deseada)

/* We only care to explicitly initialize `s.c` */ 
struct S s = { 0, 0, 3 }; 
/* but we have to explicitly initialize `s.a` and `s.b` as well */ 

o abandonar inicialización específica por completo (probablemente su sustitución por genérico = { 0 }) y utilizar una asignación posterior a miembros específicos

struct S s = { 0 }; 
s.c = 3; 

una ventaja notable de este enfoque basado en la asignación es que es independiente desde la posición del miembro c en la declaración de struct S.

La nueva especificación del lenguaje C (C99) le permite utilizar inicializadores "etiqueta" suministrando el nombre del miembro deseado dentro del {}

struct S s = { .c = 3 }; 

De esta manera sólo se inicializa explícitamente el miembro (s) deseada (y tener el compilador para inicializar a cero el resto). Esto no solo le ahorra algo de tipeo, sino que también hace que los inicializadores agregados sean independientes del orden en que se especifican los miembros en la declaración de tipo de estructura.

Los inicializadores agregados, como probablemente sepa, se pueden usar con arreglos, también. Y C99 también admite la inicialización "etiquetada" con matrices. El aspecto de "etiquetas" en el caso de una matriz se ilustra con el siguiente ejemplo

int a[10] = { [5] = 3 }; 
/* `a[5]` is initialized with 3, the rest of `a` is zero-initialized */ 

Cabe destacar una vez más que el lenguaje C sigue a pegarse al enfoque de "todo o nada" para agregar inicialización: si especifica un inicializador explícito para solo uno (o algunos) miembros de una estructura o una matriz, todo el agregado se inicializa y los miembros sin inicializadores explícitos se inicializan en cero.

+0

Sin embargo, la inicialización etiquetada no se admite en C++. Solo se admite el estilo de secuencia. – ShitalShah

+0

@AnT +1 para la gran respuesta. –

1

Otro beneficio que cabe mencionar con respecto a este tipo de inicialización es que permite el reordenamiento de los miembros de la estructura, que en algunos casos puede mejorar el rendimiento al colocar punteros a los miembros frecuentemente accedidos en la misma línea de caché de hardware.

Cuestiones relacionadas