在英特尔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 = {
}
};
答案 0 :(得分:6)
这是一种称为designated initializer的C99语法。
在早期的C标准中,struct initializer的元素必须以与struct定义中相同的顺序出现。使用指定的初始化程序,该限制被取消。当然,结构成员必须被命名以指示正在初始化哪个成员。
指定的初始值设定项也可以与数组一起使用,并允许您初始化数组的特定元素。例如:
int a[6] = { [4] = 29, [2] = 15 };
答案 1 :(得分:2)
这是名为designated initializers的C99功能。它允许您指定要设置值的字段的名称,而不是按照声明中相应字段的顺序指定值。此外,此语法允许您初始化除第一个之外的联合成员 - 这在C99之前是不可能的。
答案 2 :(得分:2)
如果你有
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
};
这样,您可以按任何顺序初始化成员变量,甚至可以跳过一些。
这在您需要由用户初始化某些变量的库中特别有用,而其他变量更内部,甚至可以使用库的不同版本进行更改。使用这种初始化,用户不需要知道那些额外的变量。