J'ai frappé du code c dans le noyau 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,
},
{ }
};
Ici, un tableau de structures se termine par { }
. Dans quel but a-t-il été ajouté?
Soit dit en passant, un peu au-dessus de ce code, il y a un autre tableau de structures , mais sans accolades vides à la fin.
Quand dois-je utiliser des accolades vides à la fin d'un tableau de structures?
c
arrays
struct
linux-kernel
Cellule NK
la source
la source
-pedantic
.Réponses:
Cette modification particulière faisait partie du réseau sysctl: supprimer le code binaire sysctl inutilisé validé par Eric W. Biederman, en changeant l'initialisation du dernier élément du
ip_ct_sysctl_table
tableau de{0}
à{}
(et effectuant des modifications similaires à de nombreuses autres initialisations de tableau).Le
{0}
modèle semble avoir été bien plus longtemps que, et les deux{0}
ou{}
dernier élément initialisation est généralement (dans le code source Linux) fait explicitement référence commeTerminating entry
, il est donc probable un cadeau de modèle pour permettre la consommation de ces tableaux sans connaître leurs longueurs, arrêt de la consommation lors de la saisie de l'entrée de fin initialisée à zéro. Par exemple, pour les tableaux similaires danssound/aoa/fabrics/snd-aoa-fabric-layout.c
l'intention de l'initialisation zéro est même explicitement mentionné dans un commentaire, par exemple:la source
int arr[] = {}
(étant donné que nous utilisons l'extension d'initialisation vide GNU) un tableau vide; c'est-à-dire la taille de l'arr
être0
?{ initializer-list }
liste des initialiseurs:designation(opt) initializer
ouinitializer-list , designation(opt) initializer
Vous connaissez probablement les chaînes terminées par zéro.
ctl_table ip_ct_sysctl_table[]
est un tableau terminé par zéro, c'est-à-dire que la dernière entrée du tableau a des membres entièrement nuls.la source
procname
est nul oumaxlen
nul.procname
pourrait être unchar[100]
cas dans lequel il est""
, non nul. Mais sinon oui.Pour être clair: les "accolades vides '{}' à la fin du tableau de structures" ne sont pas nécessaires pour satisfaire aux exigences de la syntaxe C.
Quand le code veut une valeur sentinelle .
Il est parfois utile pour le programme d'avoir un élément de tableau final de tous les zéros - certainement pour détecter la fin. Le besoin vient de l'utilisation du tableau par l'application
ctl_table ip_ct_sysctl_table[]
, et non d'un besoin en langage C.la source
C'est un élément initialisé à zéro à la fin du tableau afin d'augmenter le nombre d'éléments du tableau de un.
Considérez cette petite démo:
La taille du
arr
tableau changera si vous décommentez le{}
à la fin de la liste d'initialisation du tableau.Les sorties:
Avec
// {}
(le tableau a 2 éléments)Avec
{}
(le tableau a 3 éléments)Plus d'explications:
Le
ip_ct_sysctl_table
tableau n'est utilisé qu'à un seul endroit, c'est-à-dire ici:Le supplément
{}
augmente la taille totaleip_ct_sysctl_table
.la source
{ }
est un initialiseur. Mais le pourquoi n'est toujours pas clair. Ainsi, pour l' instant de toute façon, le mot probablement est probablement une bonne idée. :)