Я ударил некоторых с код в ядре 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,
},
{ }
};
Здесь массив структур заканчивается { }
. Для чего это было добавлено?
Кстати, чуть выше этого кода есть еще один массив структур , но без пустых скобок в конце.
Когда я должен использовать пустые скобки в конце массива структур?
c
arrays
struct
linux-kernel
NK-клетки
источник
источник
-pedantic
.Ответы:
Это конкретное изменение было частью сети sysctl: удалите неиспользованный двоичный код sysctl, принятый Эриком Бидерманом, изменив инициализацию последнего элемента
ip_ct_sysctl_table
массива с{0}
на{}
(и выполняет аналогичные изменения для многих других инициализаций массива).{0}
Картина , кажется, был гораздо дольше , хотя, и оба{0}
или{}
последний элемент-инициализации обычно (в исходном коде Linux) явно упоминается какTerminating entry
, так что, вероятно , картина присутствует , чтобы потреблять эти массивы , не зная их длины, прекращение потребления при попадании в инициализируемую нулем завершающую запись. Например, для подобных массивов в целяхsound/aoa/fabrics/snd-aoa-fabric-layout.c
инициализации нуля даже явно упоминается в комментарии, например:источник
int arr[] = {}
(учитывая, что мы используем пустое расширение инициализатора GNU) привести к пустому массиву; т.е. размерarr
существа0
?{ initializer-list }
список инициализаторов:designation(opt) initializer
илиinitializer-list , designation(opt) initializer
Вы, вероятно, знакомы с завершенными нулями строками.
ctl_table ip_ct_sysctl_table[]
является массивом с нулевым символом в конце, то есть последняя запись массива имеет все элементы с нулем.источник
procname
,maxlen
ноль или ноль.procname
может быть,char[100]
в этом случае это""
не ноль. Но в остальном да.Для ясности: «пустые скобки» {} 'в конце массива структур »не нужны для удовлетворения требований синтаксиса C.
Когда код хочет дозорного значения .
Иногда для программы полезно иметь конечный элемент массива всех нулей - конечно, чтобы определить конец. Необходимость исходит от использования приложения массива
ctl_table ip_ct_sysctl_table[]
, а не от необходимости языка C.источник
Это один нулевой инициализированный элемент в конце массива, чтобы увеличить количество элементов массива на один.
Рассмотрим это небольшое демо:
Размер
arr
массива изменится, если вы раскомментируете{}
в конце списка инициализации массива.Выходы:
С
// {}
(массив имеет 2 элемента)С
{}
(массив имеет 3 элемента)Дальнейшее объяснение:
ip_ct_sysctl_table
Массив используется только в одном месте, то есть здесь:Дополнительно
{}
увеличивает общий размерip_ct_sysctl_table
.источник
{ }
это инициализатор. Но почему до сих пор неясно. Таким образом, на данный момент, во всяком случае, слово, вероятно, является хорошей идеей. :)