C 和 C + + : 自动结构的部分初始化

例如,如果 somestruct有三个整数成员,我一直认为在 C (或 C + +)函数中这样做是可以的:

somestruct s = {123,};

第一个成员将被初始化为123,最后两个成员将被初始化为0。我经常对自动数组做同样的事情,编写 int arr[100] = {0,};以便数组中的所有整数都初始化为零。


最近我在 GNU C 参考手册上读到:

如果不初始化结构变量,则效果取决于 是否具有静态存储(请参阅存储类说明符)或 如果是,则使用0和 指针成员初始化为 NULL; 否则,指针成员的 结构的成员是不确定的。


谁能告诉我 C 和 C + + 标准对于部分自动结构和自动数组初始化说了些什么?我在 Visual Studio 中完成上面的代码没有问题,但是我想兼容 gcc/g + + ,也许还要兼容其他编译器。谢谢

67447 次浏览

链接的 gcc 文档不谈论 部分初始化,它只谈论 (完成)初始化没有初始化

什么是局部初始化?

这些标准没有定义对象的部分初始化,要么有完全初始化,要么没有初始化。部分初始化是一个非标准术语,通常指的是提供一些初始化器但不是全部的情况,即: 初始化器比数组的大小或被初始化的结构元素的数量少。

例如:

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的行为。

关于部分初始化(Case 1)的规则由标准很好地定义,并且这些规则不依赖于被初始化的变量的存储类型。
AFAIK,所有主流编译器都100% 符合这些规则。


谁能告诉我 C 和 C + + 标准对于部分自动结构和自动数组初始化说了些什么?

C 和 C + + 标准保证,即使一个整数数组位于自动存储器上,并且如果在括号内的列表中有较少的初始化器,那么未初始化的元素 必须的将被初始化为 0

C99标准6.7.8.21

如果括号内的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化大小已知的数组的字符串文本中的字符少于数组中的元素,则聚合的其余部分应该与具有静态存储持续时间的对象隐式初始化相同。


在 C + + 中,规则的陈述略有不同。

C + + 03标准8.5.1集合
第七段:

如果列表中的初始化器少于聚合中的成员,那么每个未显式初始化的成员应该是 值初始化(8.5)。 [例子:

 struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };

1初始化 ss.a,用 "asdf"初始化 ss.b,用 int()表达式的值初始化 ss.c,即 0。]

中定义值初始化时,
C + + 038.5初始化器
第五段:

对于 Value-initialize 值初始化,T 类型的对象意味着:
ーー如果 T 是一个类类型(子句9) ,带有用户声明的构造函数(12.1) ,则调用 t 的缺省构造函数(如果 T 无法访问,则初始化是病态的) 缺省构造函数) ;
ー如果 T 是没有用户声明的构造函数的非联合类类型,那么每个非静态 对 T 的数据成员和基类成员进行值初始化;
如果 T 是一个数组类型,那么每个元素都是值初始化的;
否则,该对象为零初始化

在 C 语言中,对象是部分初始化的 永远不会——如果它们的任何部分被初始化,那么整个对象(以及所有递归的子对象)都会被初始化。如果没有提供显式的初始化器,那么元素被初始化为“适当类型的零”。

您问题中的引号指的是整个对象的初始化器完全被忽略的时候,而不是子对象缺少初始化器的时候。例如,假设 arr具有自动存储持续时间,那么这样:

int arr[100] = { 123 };

初始化 arr[0]123,以及 arr0的所有其他元素:

int arr[100];

使得 arr的每一个元素都没有被初始化。正是在后一种情况下,引用了。

最新的 gcc 版本还允许同时“部分”初始化和零点:

typedef struct{
int a,b,c;
}T;


T s = {0, .b=5};

结构成员现在将具有以下值: a=0, b=5, c=0

我没有关于其他编译器是否允许这样做的任何信息: p