我在Linux内核中碰到了一些C 代码:
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,
},
{ }
};在这里,一个结构数组以{ }结尾。它是为了什么目的而增加的?
顺便说一下,在这段代码的上方还有另一个结构数组,但末尾没有空大括号。
何时应该在结构数组的末尾使用空大括号?
发布于 2020-03-02 14:36:34
这个特定的更改是EricW.Biederman提交的https://github.com/torvalds/linux/commit/f8572d8f2a2ba75408b97dc24ef47c83671795d7的一部分,它将ip_ct_sysctl_table数组的最后一个元素的初始化从{0}更改为{} (并执行与许多其他数组初始化类似的更改)。
然而,{0}模式似乎已经存在了很长时间,而且{0}或{}最终元素初始化通常(在Linux源代码中)都被显式地称为Terminating entry,因此很可能存在这样一种模式:允许在不知道这些数组的长度的情况下使用它们,在触及零初始化终止条目时终止消耗。例如,对于sound/aoa/fabrics/snd-aoa-fabric-layout.c中类似的数组,零初始化的意图甚至在注释中被显式地提到,例如:
静态结构codec_connection toonie_connections[] ={{ .connected = CC_SPEAKERS = CC_HEADPHONE,.codec_bit = 0,},{} /*终止数组由.connected == 0 */ };
发布于 2020-03-02 13:08:28
你可能很熟悉以零结尾的字符串。ctl_table ip_ct_sysctl_table[]是一个以零结尾的数组,即最后一个数组条目具有全零成员.
发布于 2020-03-02 15:59:45
结构数组末尾的空大括号“{}”需要什么?
需要明确的是:不需要结构数组末尾的“空大括号'{ }”来满足C语法要求。
何时应该在结构数组的末尾使用空大括号?
当代码想要一个前哨值时。
有时,对于程序来说,有一个所有零的最终数组元素是有用的--当然是用来检测结束的。需求来自应用程序对数组ctl_table ip_ct_sysctl_table[]的使用,而不是C语言的需求。
https://stackoverflow.com/questions/60489448
复制相似问题