Uderzyłem trochę kodu c w jądrze Linuksa:
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,
},
{ }
};
Tutaj kończy się tablica struktur { }
. W jakim celu został dodany?
Nawiasem mówiąc, nieco powyżej tego kodu znajduje się kolejna tablica struktur , ale na końcu bez pustych nawiasów klamrowych.
Kiedy powinienem używać pustych nawiasów klamrowych na końcu tablicy struktur?
c
arrays
struct
linux-kernel
Komórka NK
źródło
źródło
-pedantic
.Odpowiedzi:
Ta szczególna zmiana była częścią sieci sysctl: Usuń nieużywany binarny kod sysctl zatwierdzony przez Erica W. Biedermana, zmieniając inicjalizację ostatniego elementu
ip_ct_sysctl_table
tablicy z{0}
na{}
(i wykonuje podobne zmiany w stosunku do wielu innych inicjalizacji tablicy).{0}
Wzór wydaje się, że już na znacznie dłużej, choć i zarówno{0}
lub{}
końcowy element inicjujący jest powszechnie (w kodzie źródłowym Linux) wyraźnie dalejTerminating entry
, więc jest prawdopodobne, obecny wzór, aby umożliwić spożywanie tych tablic nie znając ich długości, zużycie końcowe po trafieniu w zainicjowany przez zero wpis zakończenia. Np. Dla podobnych tablic wsound/aoa/fabrics/snd-aoa-fabric-layout.c
celu zerowej inicjalizacji jest nawet wyraźnie wspomniane w komentarzu, np .:źródło
int arr[] = {}
(biorąc pod uwagę, że używamy pustego rozszerzenia inicjującego GNU) pustej tablicy; tzn. wielkośćarr
bytu0
?{ initializer-list }
lista inicjatorów:designation(opt) initializer
lubinitializer-list , designation(opt) initializer
Prawdopodobnie znasz ciągi zerowane.
ctl_table ip_ct_sysctl_table[]
jest tablicą zakończoną zerem, tzn. ostatnia pozycja tablicy ma elementy całkowicie zerowe.źródło
procname
wartość zero lubmaxlen
zero.procname
może byćchar[100]
w takim przypadku""
, a nie zerowy. Ale poza tym tak.Żeby było jasne: „puste nawiasy klamrowe {}” na końcu tablicy struktur ”nie są potrzebne do spełnienia wymagań składni C.
Gdy kod chce wartości wartownika .
Czasami przydatne jest, aby program miał końcowy element tablicy zawierający wszystkie zera - z pewnością do wykrycia końca. Potrzeba wynika z zastosowania aplikacji tablicy
ctl_table ip_ct_sysctl_table[]
, nie z potrzeby języka C.źródło
Jest to jeden element inicjowany zerem na końcu tablicy, aby zwiększyć liczbę elementów tablicy o jeden.
Rozważ to małe demo:
Rozmiar
arr
tablicy zmieni się, jeśli usuniesz zaznaczenie{}
na końcu listy inicjalizacji tablicy.Wyjścia:
Z
// {}
(tablica ma 2 elementy)Z
{}
(tablica ma 3 elementy)Dalsze wyjaśnienia:
ip_ct_sysctl_table
Tablica jest używana tylko w jednym miejscu, które jest tutaj:Dodatkowy
{}
zwiększa całkowity rozmiarip_ct_sysctl_table
.źródło
{ }
jest to inicjator. Ale dlaczego wciąż nie jest jasne. Tak więc, na razie tak, słowo prawdopodobnie jest dobrym pomysłem. :)