奇怪的结构定义

在英特尔DPDK的代码示例中,我发现了这种奇怪的语法结构。 谁能解释一下这是什么意思?

static const struct rte_eth_conf port_conf = { .rxmode = { .split_hdr_size = 0, .header_split = 0, .hw_ip_checksum = 0, .hw_vlan_filter = 0, .jumbo_frame = 0, .hw_strip_crc = 0, }, .txmode = { } }; 

如果你有

 struct X { type_a var_a; type_b var_b; type_c var_c; type_d var_d; }; 

你可以像这样初始化一个对象:

 struct X x = {value_a, value_b, value_c, value_d}; 

但这意味着你需要知道X中变量的顺序以及所有变量的初始值。 或者,您可以像这样初始化:

 struct X x = { .var_a = value_a, .var_b = value_b, .var_c = value_c, .var_d = value_d }; 

这样,您可以按任何顺序初始化成员变量,甚至可以跳过一些。

这在库中特别有用,在库中您需要由用户初始化一些变量,而其他变量更内部,甚至可以使用库的不同版本进行更改。 使用这种初始化,用户不需要知道那些额外的变量。

这是一种称为指定初始化程序的C99语法。

在早期的C标准中,struct初始化程序的元素必须以与struct定义中相同的顺序出现。 使用指定的初始化程序,该限制被取消。 当然,必须命名struct成员以指示正在初始化哪个成员。

指定的初始值设定项也可以与数组一起使用,并允许您初始化数组的特定元素。 例如:

 int a[6] = { [4] = 29, [2] = 15 }; 

这是称为指定初始值设定项的C99function。 它允许您指定要设置值的字段的名称,而不是按照声明中相应字段的顺序指定值。 此外,此语法允许您初始化除第一个之外的联合成员 – 这在C99之前是不可能的。