Golpeé un código c en el kernel de Linux:
static struct ctl_table ip_ct_sysctl_table[] = {
{
.procname = "ip_conntrack_max",
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = proc_dointvec,
},
// ...
{
.procname = "ip_conntrack_log_invalid",
.maxlen = sizeof(unsigned int),
.mode = 0644,
.proc_handler = proc_dointvec_minmax,
.extra1 = &log_invalid_proto_min,
.extra2 = &log_invalid_proto_max,
},
{ }
};
Aquí una matriz de estructuras termina con { }
. ¿Para qué se agregó?
Por cierto, un poco por encima de este código hay otra matriz de estructuras , pero sin llaves vacías al final.
¿Cuándo debo usar llaves vacías al final de una matriz de estructuras?
c
arrays
struct
linux-kernel
Célula NK
fuente
fuente
-pedantic
.Respuestas:
Este cambio en particular fue parte de la red sysctl: elimine la confirmación del código sysctl binario no utilizado por Eric W. Biederman, cambiando la inicialización del último elemento de la
ip_ct_sysctl_table
matriz de{0}
a{}
(y realiza cambios similares a muchas otras inicializaciones de matriz).Sin
{0}
embargo, el patrón parece haber existido durante mucho más tiempo, y ambos,{0}
o{}
la inicialización de elementos final, se conoce comúnmente (en el código fuente de Linux) como explícitamenteTerminating entry
, por lo que es probable que exista un patrón que permita consumir estas matrices sin conocer su longitud, consumo de terminación al golpear la entrada de terminación inicializada cero. Por ejemplo, para las matrices similares ensound/aoa/fabrics/snd-aoa-fabric-layout.c
la intención de la inicialización cero, incluso se menciona explícitamente en un comentario, por ejemplo:fuente
int arr[] = {}
(dado que estamos usando la extensión de inicializador vacía GNU) da como resultado una matriz vacía; es decir, el tamaño delarr
ser0
?{ initializer-list }
entonces la lista de inicializadores:designation(opt) initializer
oinitializer-list , designation(opt) initializer
Probablemente esté familiarizado con las cadenas terminadas en cero.
ctl_table ip_ct_sysctl_table[]
es una matriz terminada en cero, es decir, la última entrada de la matriz tiene miembros completamente cero.fuente
procname
es nulo omaxlen
es cero.procname
podría serchar[100]
en cuyo caso es""
, no nulo. Pero por lo demás sí.Para ser claros: las "llaves vacías '{}' al final de la matriz de estructuras" no son necesarias para satisfacer los requisitos de sintaxis de C.
Cuando el código quiere un valor centinela .
A veces es útil que el programa tenga un elemento de matriz final de todos los ceros, ciertamente para detectar el final. La necesidad proviene del uso de la aplicación de la matriz
ctl_table ip_ct_sysctl_table[]
, no de una necesidad de lenguaje C.fuente
Es un elemento inicializado al cero al final de la matriz para aumentar el número de elementos de la matriz en uno.
Considere esta pequeña demostración:
El tamaño de la
arr
matriz cambiará si elimina el comentario{}
al final de la lista de inicialización de la matriz.Salidas:
Con
// {}
(la matriz tiene 2 elementos)Con
{}
(la matriz tiene 3 elementos)Explicación adicional:
La
ip_ct_sysctl_table
matriz solo se usa en un lugar, es decir, aquí:El extra
{}
aumenta el tamaño totalip_ct_sysctl_table
.fuente
{ }
es un inicializador. Pero el por qué aún no está claro. Por lo tanto, por ahora de todos modos, la palabra probablemente sea una buena idea. :)