Eu bati algum código c no kernel do 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,
},
{ }
};
Aqui, uma matriz de estruturas termina com { }
. Para que finalidade foi adicionada?
A propósito, um pouco acima desse código, há outra matriz de estruturas , mas sem chaves vazias no final.
Quando devo usar chaves vazias no final de uma matriz de estruturas?
c
arrays
struct
linux-kernel
Célula NK
fonte
fonte
-pedantic
.Respostas:
Essa alteração em particular fazia parte da rede sysctl: Remova o código binário sysctl não utilizado confirmado por Eric W. Biederman, alterando a inicialização do último elemento da
ip_ct_sysctl_table
matriz de{0}
para{}
(e executa alterações semelhantes a muitas outras inicializações de matriz).O
{0}
padrão parece existir há muito mais tempo, e a inicialização de ambos os elementos{0}
ou{}
final é comumente referida (no código-fonte do Linux) explicitamente referida comoTerminating entry
, portanto, é provável que haja um padrão presente para permitir o consumo dessas matrizes sem saber seus comprimentos, terminando o consumo ao pressionar a entrada de finalização inicializada com zero. Por exemplo, para matrizes semelhantes nasound/aoa/fabrics/snd-aoa-fabric-layout.c
intenção da inicialização zero, é mencionado explicitamente em um comentário, por exemplo:fonte
int arr[] = {}
(dado que estamos usando a extensão do inicializador vazio GNU) resultaria em uma matriz vazia; ou seja, o tamanho doarr
ser0
?{ initializer-list }
seguida, a lista de inicializadores:designation(opt) initializer
ouinitializer-list , designation(opt) initializer
Você provavelmente está familiarizado com cadeias terminadas em zero.
ctl_table ip_ct_sysctl_table[]
é uma matriz terminada com zero, ou seja, a última entrada da matriz possui membros com zero.fonte
procname
é nulo oumaxlen
é zero.procname
pode ser umchar[100]
caso em que não é""
nulo. Mas caso contrário, sim.Para ficar claro: o "colchetes vazios '{}' no final da matriz de estruturas" não é necessário para atender aos requisitos de sintaxe C.
Quando o código deseja um valor de sentinela .
Às vezes, é útil que o programa tenha um elemento final da matriz com todos os zeros - certamente para detectar o final. A necessidade vem do uso do array pelo aplicativo
ctl_table ip_ct_sysctl_table[]
, não da necessidade da linguagem C.fonte
É um elemento inicializado com zero no final da matriz para aumentar o número de elementos da matriz em um.
Considere esta pequena demonstração:
O tamanho da
arr
matriz será alterado se você descomentar{}
no final da lista de inicialização da matriz.Saídas:
With
// {}
(array possui 2 elementos)With
{}
(array tem 3 elementos)Mais explicações:
A
ip_ct_sysctl_table
matriz é usada apenas em um local, aqui:O extra
{}
aumenta o tamanho totalip_ct_sysctl_table
.fonte
{ }
é um inicializador. Mas o porquê ainda não está claro. Portanto, por enquanto, a palavra provavelmente é provavelmente uma boa ideia. :)