Sag*_*ian 14 c structure initialization c99 designated-initializer
我知道在C99中你可以使用成员名称初始化结构的成员,如下所示:
struct myStruct
{
int i;
char c;
float f;
};
Run Code Online (Sandbox Code Playgroud)
以下是有效的:
struct myStruct m = {.f = 10.11, .i = 5, .c = 'a'};
Run Code Online (Sandbox Code Playgroud)
还有人说,未初始化的成员将被设置为0.所以
struct myStruct m = {.f = 10.11, .c = 'a'};
Run Code Online (Sandbox Code Playgroud)
这里i将设置为0
但是,对于以下内容:
struct myStruct m = {.f = 10.11, .c = 'a', 6};
Run Code Online (Sandbox Code Playgroud)
i 仍然初始化为0.如果我们进行这样的复合初始化是什么原因.
Sha*_*our 14
这在C99标准部分6.7.8 初始化草案中有所涉及,基本上如果下面的初始化程序不是指示符,那么它将在该指定符之后接收下一个字段,对于您的示例而言f.我们可以看看第17段(强调我的):
每个大括号括起的初始化列表都有一个关联的当前对象.当没有指定时,根据当前对象的类型按顺序初始化当前对象的子对象:增加下标顺序的数组元素,声明顺序中的结构成员,以及union的第一个命名成员.29)相反,指定使得以下初始化器开始初始化由指示符描述的子对象.然后初始化按顺序继续向前,从指定者描述的下一个子对象开始 .130)
为什么i被初始化为0第19段,其中说:
初始化应在初始化器列表顺序中进行,每个初始化器为特定子对象提供,覆盖任何先前列出的同一子对象的初始化器; 132)未明确初始化的所有 子对象应与具有静态存储持续时间的对象隐式初始化.
请注意,正如Keith指出的那样gcc使用-Wextra以下方法提供警告:
warning: initialized field overwritten [-Woverride-init]
struct myStruct m = {.f = 10.11, .c = 'a', 6};
^
Run Code Online (Sandbox Code Playgroud)
并且clang似乎默认警告这一点.
的情况下
struct myStruct = {.f = 10.11, .c = 'a', 6};
Run Code Online (Sandbox Code Playgroud)
6非指定初始值设定项的值将在使用指定的初始值设定项初始化的成员之后分配给成员.因此,在这种情况下,成员f就在之后c,因此它将被初始化为6.i仍将0默认初始化为.