鏈接的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骨料
帕拉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初始化器
第5段:
要值初始化類型T的對象是指:
- 如果T是具有用戶聲明的構造函數的類類型(第9節)1),那麼T的默認構造函數被調用(並且如果T沒有可訪問的默認構造函數,則初始化是不合格的);
- 如果T是一個沒有用戶聲明構造函數的非聯合類類型,那麼T的每個非靜態數據成員和基類組件都進行了值初始化;
- 如果T是一個數組類型,那麼每個元素都進行了值初始化;
- 否則,該目的是零初始化
對於C++ - 問題的一部分,[這個問題](http://stackoverflow.com/questions/1613341/)可能會讓你感興趣。 –