相关的gcc文档并没有提到Partial Initialization,只是提到(Complete)Initialization或No Initialization.
What is partial Initialization?
这些标准没有定义对象的部分初始化,或者存在完全初始化,或者没有初始化.部分初始化是一个非标准术语,通常指的是提供一些初始值设定项但不是全部的情况,即:初始值设定项少于数组的大小或被初始化的 struct 元素的数量.
示例:
int array[10] = {1,2}; //Case 1:Partial Initialization
What is (Complete)Initialization or No Initialization?个
初始化意味着在创建变量的同时为其提供一些初始值.ie:在同一个代码声明中.
示例:
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
人的行为.
标准很好地定义了有关部分初始化(Case 1
)的规则,这些规则不依赖于正在初始化的变量的存储类型.
AFAIK,所有主流编译器都有Case 1
%遵守这些规则.
Can someone please tell me what the C and C++ standards say regarding partial automatic structure and automatic array initialization?
C和C++标准保证即使整数数组位于自动存储器上,并且如果在大括号包围的列表中有较少的初始化式,则未初始化的元素must被初始化为0
.
C99 Standard 6.7.8.21个
如果大括号内的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文本中的字符少于数组中的元素,则聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同.
在C++中,规则的声明略有不同.
C++03 Standard 8.5.1 Aggregates
Para 7:
If there are fewer initializers in the list than there are members in the aggregate, then each member not explicitly initialized shall be value-initialized (8.5).
[示例:
struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };
用1
初始化ss.a
,用"asdf"
初始化ss.b
,用int()
形式的表达式的值初始化ss.c
,即0
.]
While Value Initialization is defined in,
C++03 8.5 Initializers
Para 5:
对于value-initialize个T类型的对象意味着: