2011-03-16 64 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

如果您确定大小是第一个元素,这将是好的。任何没有在初始化器中获得价值的成员都将被归零。