Ответ 1
В связанной документации gcc не говорится о Частичной инициализации, она просто говорит о (Полная) Инициализация или Без инициализации.
Что такое частичная инициализация?
Стандарты не определяют частичную инициализацию объектов, либо выполняется полная инициализация, либо нет инициализации. Частичная инициализация - нестандартная терминология, которая обычно ссылается на ситуацию, когда вы предоставляете некоторые инициализаторы, но не все. I: Меньше инициализаторов, чем размер массива или количество инициализированных элементов структуры.
Пример:
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 и С++ гарантируют, что даже если целочисленный массив находится в автоматическом хранилище, и если в списке, заключенном в скобки, меньше инициализаторов, то инициализируются неинициализированные элементы на 0
.
C99 Стандарт 6.7.8.21
Если в списке, заключенном в скобках, меньше инициализаторов, чем в элементе или элементах совокупности или меньше символов в строковом литерале, используемом для инициализации массива с известным размером, чем в массиве, остальная часть агрегат должен быть инициализирован неявным образом так же, как объекты, имеющие статическую продолжительность хранения.
В С++ правила указаны с небольшой разницей.
С++ 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
. ]
Пока инициализируется значение Инициализация,
С++ 03 8.5 Инициализаторы
Параграф 5:
В value-initialize объект типа T означает:
- если T - тип класса (раздел 9) с объявленным пользователем конструктором (12.1), тогда вызывается конструктор по умолчанию для T (и инициализация плохо сформирована, если T не имеет доступного конструктор по умолчанию); - если T - тип неединичного класса без конструктора, объявленного пользователем, то каждый нестатический элемент данных и компонент базового класса T инициализируются значением;
- если T - тип массива, то каждый элемент инициализируется значением; - в противном случае объект инициализируется нулем