例如,如果somestruct有三个整数成员,我一直认为在C(或C++)函数中这样做是可以的:
somestruct s = {123,};第一个成员将初始化为123,最后两个成员将初始化为0。我经常对自动数组做同样的事情,编写int arr[100] = {0,};,以便将数组中的所有整数初始化为零。
最近我在GNU C Reference Manual上读到:
如果不初始化结构变量,其效果取决于它是否具有静态存储(请参见存储类说明符)。如果是,则使用0初始化具有整型的成员,将指针成员初始化为NULL;否则,结构成员的值是不确定的。
请有人告诉我C和C++标准对部分自动结构和自动数组初始化有什么看法吗?我在Visual中做了上面的代码,没有问题,但是我想要兼容gcc/g++,也许还有其他编译器。谢谢
发布于 2012-05-31 06:13:35
链接gcc的文档不涉及部分初始化,它只讨论或No初始化。
什么是部分初始化?
这些标准没有定义对象的部分初始化,无论是完全初始化还是不初始化.部分初始化是一种非标准术语,通常指的是提供一些初始化程序但不是全部的情况,即:初始化器少于数组的大小或正在初始化的结构元素的数量。
示例:
int array[10] = {1,2}; //Case 1:Partial 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,所有主流编译器都100%符合这些规则。
请谁告诉我C和C++标准对部分自动结构和自动数组初始化有什么看法?
C和C++标准保证,即使整数数组位于自动存储中,如果大括号括起来的列表中有较少的初始化器,那么未初始化的元素必须初始化为0。
C99标准6.7.8.21
如果大括号括起来的列表中的初始化项少于聚合的元素或成员,或者字符串文字中用于初始化已知大小的数组的字符少于数组中的元素,则聚合的其余部分将隐式初始化,与具有静态存储持续时间的对象相同。
在C++中,规则的表述略有不同。
C++03标准8.5.1集合
第7段:
如果列表中的初始化器比聚合中的成员少,那么没有显式初始化的每个成员都应该是value-initialized (8.5)。示例:
结构S{ int a;char* b;int c;};S ss ={ 1,"asdf“};
用1初始化ss.a,用"asdf"初始化ss.b,用表单int()的表达式(即0 )值初始化ss.c。
中定义值初始化时,
C++03 8.5初始化器
第5段:
value-initialize类型为T的对象的
表示:
-如果T是具有用户声明的构造函数(12.1)的类类型(第9条),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
-如果T是一个没有用户声明的构造函数的非联合类类型,那么T的每个非静态数据成员和基类组件都是值初始化的;
-如果T是数组类型,则每个元素都是值初始化的;
-否则,对象是零初始化的。
发布于 2012-05-31 06:31:18
在C中,对象从不被部分初始化--如果其中的任何部分被初始化,则整个对象(以及所有子对象递归地)被初始化。如果没有提供显式初始化,则元素初始化为“适当类型的零”。
问题中的引号是指整个对象的初始化项何时被完全排除在外,而不是当子对象缺少初始化项时。例如,假设arr具有自动存储持续时间,则如下所示:
int arr[100] = { 123 };将arr[0]初始化为123,将arr的其他元素初始化为0。鉴于这一点:
int arr[100];arr的每个元素都没有初始化。引文所指的就是后一种情况。
发布于 2013-02-26 19:44:34
最新的gcc版本还允许在“部分”初始化和零的同时:
typedef struct{
int a,b,c;
}T;
T s = {0, .b=5};结构成员现在将具有以下值:a=0, b=5, c=0
关于其他编译器是否允许这样做,我没有任何信息:
https://stackoverflow.com/questions/10828294
复制相似问题