链接的 gcc 文档没有谈论Partial Initialization它只是谈论(Complete)Initialization或No Initialization。
什么是部分初始化?
标准没有定义对象的部分初始化,要么有完全初始化,要么没有初始化。部分初始化是一个非标准术语,通常是指您提供一些初始化器但不是全部的情况,即:初始化器少于数组的大小或正在初始化的结构元素的数量。
例子:
int array[10] = {1,2}; //Case 1:Partial Initialization
什么是(完全)初始化或无初始化?
初始化意味着在创建变量的同时为创建的变量提供一些初始值。即:在相同的代码语句中。
例子:
int array[10] = {0,1,2,3,4,5,6,7,8,9}; //Case 2:Complete Initialization
int array[10]; //Case 3:No Initialization
引用的段落描述了Case 3
.
有关 Partial Initialization( 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 Initializers
Para 5 中定义:
对T 类型的对象进行值初始化意味着:
— 如果 T 是具有用户声明的构造函数(12.1)的类类型(第 9 条),则调用 T 的默认构造函数(如果 T没有可访问的默认构造函数);
— 如果 T 是没有用户声明的构造函数的非联合类类型,则 T 的每个非静态数据成员和基类组件都是值初始化的;
— 如果 T 是一个数组类型,那么每个元素都是值初始化的;
— 否则,对象被零初始化