链接的gcc文档没有提到部分初始化,而只是谈论(Complete)Initialization或No Initialization。
什么是部分初始化?
这些标准没有定义对象的部分初始化,无论是完全初始化还是没有初始化。部分初始化是一种非标准术语,通常是指您提供了一些初始化器但未全部提供的情况,即:初始化器少于数组的大小或要初始化的结构元素的数量。
例:
int array[10] = {1,2};
什么是(完全)初始化或没有初始化?
初始化是指在创建变量的同时为其提供一些初始值。即:在同一代码语句中。
例:
int array[10] = {0,1,2,3,4,5,6,7,8,9};
int array[10];
引用的段落描述了的行为Case 3
。
Case 1
标准已很好地定义了有关部分初始化()的规则,这些规则不依赖于要初始化的变量的存储类型。
AFAIK,所有主流编译器均100%遵守这些规则。
有人可以告诉我有关部分自动结构和自动数组初始化的C和C ++标准怎么说?
C和C ++标准保证,即使整数数组位于自动存储中,并且括号括起来的列表中的初始化程序较少,也必须将未初始化的元素初始化为0
。
C99标准6.7.8.21
如果用大括号括起来的列表中的初始化程序少于集合中的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符少于该数组中的元素,则该集合的其余部分应与具有静态存储持续时间的对象隐式初始化相同。
在C ++中,规则的声明略有不同。
C ++ 03标准8.5.1汇总
第7段:
如果列表中的初始化程序少于聚合中的成员,则每个未显式初始化的成员都应进行值初始化(8.5)。[例:
struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };
初始化ss.a
用1
,ss.b
与"asdf"
,和ss.c
与所述形式的表达的值int()
,即,0
。]
在定义值初始化的同时,
C ++ 03 8.5初始化程序
第5段:
要对类型为T的对象进行值初始化意味着:
—如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则将调用T的默认构造函数(如果T初始化为错误格式,没有可访问的默认构造函数);
—如果T是一个没有用户声明的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都将被值初始化;
—如果T是数组类型,则每个元素都进行值初始化;
—否则,该对象将被零初始化