I hit some code in Linux kernel:

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,
    },
    { }
};

这里的结构数组以{ }结尾.它的目的是什么

什么时候应该在结构数组的末尾使用空大括号?

推荐答案

这个特殊的更改是Eric W.Biederman的sysctl net: Remove unused binary sysctl code提交的一部分,它将ip_ct_sysctl_table数组最后一个元素的初始化从{0}更改为{}(并执行与许多其他数组初始化类似的更改).

{0}模式似乎已经存在了更长的时间,{0}{}最终元素初始化通常(在Linux源代码中)被显式地称为Terminating entry,因此可能存在一种模式,允许在不知道数组长度的情况下使用这些数组,当达到零时终止消耗初始化终止条目.例如,对于sound/aoa/fabrics/snd-aoa-fabric-layout.c中的类似数组,甚至在注释中明确提到了零初始化的意图,例如:

static struct codec_connection toonie_connections[] = {
  {
      .connected = CC_SPEAKERS | CC_HEADPHONE,
      .codec_bit = 0,
  },
  {} /* terminate array by .connected == 0 */
};

C++相关问答推荐

sin函数频率突然跳跃

“C”中函数内部的数据操作

C 和 Rust 代码片段之间的不同行为

强制转换为“超类”并返回 C 是否违反严格别名?

如何获得 C 函数的基本编译二进制代码?

使用R的`.C`接口处理读/写文件

预处理器算法是否应该与编译所针对的体系结构相匹配?

将所有位从最低有效位翻转到最高有效最后 1 位值的最有效方法是什么?

C中的通用快速排序

新手:定义的字符串是否设置为所有 NULL?

我们可以使用变量根据需要给出数组中元素的数量吗?

编译后的C代码对R'给出了不同的结果;他在用deSolve

为什么将 free 的返回值转换为 void?

绝对值 abs(x) 使用按位运算符和布尔逻辑

(x | y) - y 为什么不能简单地是 x 甚至 `x | 0`

如何制作一个不会被优化的无限空循环?

并行将 64 位整数中的压缩 8 位整数减 1,没有硬件 SIMD 的 SWAR

防止控制台窗口在 Visual Studio C/C++ 控制台应用程序上关闭

“保留用于任何用途”是什么意思?

什么是 C17,语言做了哪些改变?