2011-03-16 62 views
6

我做了很多用C Win32編程++和許多的Win32結構具有「尺寸」(通常稱爲cbSizelength)構件作爲需要相關API調用前被設置在第一元件可以做成。例如:初始化的第一個元素在一個結構

WINDOWPLACEMENT wp; 
wp.length = sizeof(WINDOWPLACEMENT); 
GetWindowPlacement(hWnd, &wp); 

現在,我認爲這是很好的做法,結構成員初始化爲零,我可以做:

WINDOWPLACEMENT wp = { }; 

WINDOWPLACEMENT wp = { 0 }; 

然而,發生了什麼結構的其他成員,如果我像這樣初始化第一個成員:

WINDOWPLACEMENT wp = { sizeof(WINDOWPLACEMENT) }; 

他們是否自動初始化爲零?還是取決於我使用的編譯器以及它是否是調試版本?

回答

11

是的,它們會自動初始化爲零。

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]

+0

+1爲報價。我正在尋找,但我引用了它:D – Nawaz 2011-03-16 19:37:45

0

此:

WINDOWPLACEMENT wp = { X }; 

將初始化所有其餘成員爲0(屁股uming POD)。

參見:8.5.1聚集[dcl.init.aggr段落:7:

7如果有較少的初始化子句在列表以外還有在聚集構件,則每個部件不顯式初始化應進行值初始化(8.5)。

[實施例:

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

初始化與1 ss.a,ss.b用 「ASDF」,和ss.c與形式爲int的表達式的值(),那 是,0.-結束示例]

+1

顯然Rob已經知道,他在問'WINDOWPLACEMENT wp = {sizeof(WINDOWPLACEMENT)};'是否將剩下的成員初始化爲零(它的確如此)。 – 2011-03-16 19:31:47

1

如果您確定大小是第一個元素,這將是好的。任何沒有在初始化器中獲得價值的成員都將被歸零。