3

在英特尔 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 = {
    }
};
4

3 回答 3

6

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

在早期的 C 标准中,结构初始值设定项的元素必须以与结构定义中相同的顺序出现。使用指定的初始化程序,该限制被解除。自然地,必须命名结构成员以指示正在初始化的成员。

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

int a[6] = { [4] = 29, [2] = 15 };
于 2012-05-23T13:21:25.687 回答
2

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

于 2012-05-23T13:21:19.233 回答
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
};

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

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

于 2012-05-23T13:22:49.873 回答