3 回答

TA貢獻1802條經(jīng)驗 獲得超5個贊
鏈接的gcc文檔沒有談到部分初始化它只談到(完成)初始化或沒有初始化。
什么是部分初始化?
標(biāo)準(zhǔn)沒有定義對象的部分初始化,要么是完全初始化,要么是無初始化。部分初始化是一種非標(biāo)準(zhǔn)術(shù)語,通常指的是您提供一些初始化器但不是全部的情況,即:初始化器的數(shù)量少于陣列的大小或初始化的結(jié)構(gòu)元素的數(shù)量。
例:
int array[10] = {1,2}; //Case 1:Partial Initialization
什么是(完整)初始化或無初始化?
初始化意味著在創(chuàng)建變量的同時為創(chuàng)建的變量提供一些初始值。即:在相同的代碼語句中。
例:
int array[10] = {0,1,2,3,4,5,6,7,8,9}; //Case 2:Complete Initializationint array[10]; //Case 3:No Initialization
引用的段落描述了行為Case 3
。
關(guān)于部分初始化(Case 1
)的規(guī)則由標(biāo)準(zhǔn)很好地定義,并且這些規(guī)則不依賴于被初始化的變量的存儲類型。
AFAIK,所有主流編譯器都100%遵守這些規(guī)則。
有人可以告訴我C和C ++標(biāo)準(zhǔn)對部分自動結(jié)構(gòu)和自動數(shù)組初始化的看法嗎?
C和C ++標(biāo)準(zhǔn)保證即使整數(shù)數(shù)組位于自動存儲上,并且如果括號括起的列表中的初始化程序較少,則必須將未初始化的元素初始化為0
。
C99標(biāo)準(zhǔn)6.7.8.21
如果括號括起的列表中的初始值設(shè)定項少于聚合的元素或成員,或者用于初始化已知大小的數(shù)組的字符串文字中的字符數(shù)少于數(shù)組中的元素,則聚合的其余部分應(yīng)為隱式初始化與具有靜態(tài)存儲持續(xù)時間的對象相同。
在C ++中,規(guī)則的陳述略有不同。
C ++ 03標(biāo)準(zhǔn)8.5.1聚合
第7段:
如果列表中的初始值設(shè)定項少于聚合中的成員,則未明確初始化的每個成員都應(yīng)進行值初始化(8.5)。[例:
struct S { int a; char* b; int c; }; S ss = { 1, "asdf" };初始化
ss.a
with1
,ss.b
with"asdf"
和ss.c
with表達式的表達式int()
,即0
。]
值初始化定義于,
C ++ 03 8.5 Initializers
Para 5:
到值初始化類型的物體T是指:
-如果T是一個類型(第9節(jié))與用戶聲明的構(gòu)造(12.1),然后對T中的默認(rèn)構(gòu)造函數(shù)被調(diào)用(以及初始化是形成不良的如果T沒有可訪問的默認(rèn)構(gòu)造函數(shù));
- 如果T是沒有用戶聲明的構(gòu)造函數(shù)的非聯(lián)合類類型,則T的每個非靜態(tài)數(shù)據(jù)成員和基類組件都是值初始化的;
- 如果T是數(shù)組類型,則每個元素都是值初始化的;
- 否則,對象被零初始化

TA貢獻1847條經(jīng)驗 獲得超7個贊
在C中,對象永遠不會被部分初始化 - 如果它們的任何部分被初始化,則初始化整個對象(以及遞歸的所有子對象)。如果沒有提供顯式初始化器,則將元素初始化為“適當(dāng)類型的零”。
您的問題中的引用是指完全遺漏整個對象的初始化程序,而不是指子對象缺少初始化程序時。例如,假設(shè)arr
具有自動存儲持續(xù)時間,那么:
int arr[100] = { 123 };
初始化arr[0]
到123
與所有其他元素arr
來0
。鑒于此:
int arr[100];
留下arr
未初始化的每一個元素。引用的是后一種情況。

TA貢獻1880條經(jīng)驗 獲得超4個贊
最新的gcc版本也允許同時“部分”初始化和zeromem:
typedef struct{ int a,b,c;}T;T s = {0, .b=5};
struct成員現(xiàn)在將具有以下值: a=0, b=5, c=0
我沒有關(guān)于其他編譯器是否允許這樣做的任何信息:p
- 3 回答
- 0 關(guān)注
- 595 瀏覽
添加回答
舉報