2010-01-29 74 views
2

我有一组结构的,定义如下:初始化嵌套结构没有定义的所有字段

typedef struct 
{ 
    int index; 
    int array[10]; 
} 
Item; 

typedef struct 
{ 
    Item A; 
    Item B; 
    Item C; 
} 
Collection; 

我要声明Collection类型的变量如下:

Collection collection = 
{ 
    { 1, 0 }, /* item A */ 
    { 2, 0 }, /* item B */ 
    { 3, 0 } /* item C */ 
}; 

请问这个将三个index变量设置为1,2和3,同时将所有三个array[]变量初始化为零?

它似乎在我的编译器上工作,但我想知道这是否是标准行为。

回答

4

这是符合标准的。请参阅 - 6.7.8初始化一节。此外,您可以在符合C99的编译器中使用指定的初始化程序。

+0

这很酷。直到今天,我从未听说过指定的初始化程序! –

7

应该有围绕零额外的支撑,使其有效的数组初始化:

Collection collection = 
{ 
    { 1, {0} }, /* item A */ 
    { 2, {0} }, /* item B */ 
    { 3, {0} } /* item C */ 
}; 

除此之外它将正确初始化结构。

inizializer也没有额外的大括号有效,但你会得到编译器的警告,并且它更容易混淆,如果初始化子集合明确。有关详细信息,请参阅C99标准中6.7.8节中直接指出的内容,特别是6.7.8(20)和6.7.8(29)中的示例。

+0

绝对有效的观察,尽管它很难回答这个问题。 +1无论如何 – qrdl

+1

+1。我认为即使没有大括号,我们也会有所谓的“不完全但始终括号内的初始化”。 – dirkgently

+0

@qrdl:我把这个问题看成是“这样做是正确的”,但你是对的,我添加了另一行清楚地表明它会正确地初始化结构。 – sth