2012-05-23 73 views
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 = { 
    } 
}; 
+1

http://stackoverflow.com/questions/763763/designated-initializers – wildplasser

回答

2

如果你有

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

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

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

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

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

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

2

这是C99功能,被称为designated initializers。它允许您指定设置值的字段名称,而不是按照相应字段在声明中出现的顺序指定值。另外,这个语法可以让你初始化除第一个之外的工会成员 - 这在C99之前是不可能的。

6

这是一个C99语法,被称为designated initializer

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

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

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