初始化结构中的第一个元素

时间:2011-03-16 19:26:25

标签: c++

我在C ++中做了很多Win32编程,许多Win32结构都有'size'(通常称为cbSizelength)成员作为第一个需要在相关API之前设置的元素可以打电话。例如:

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

现在,我认为将结构成员初始化为零是一个好习惯,我可以这样做:

WINDOWPLACEMENT wp = { };

WINDOWPLACEMENT wp = { 0 };

但是,如果我像这样初始化第一个成员,那么结构的其他成员会发生什么:

WINDOWPLACEMENT wp = { sizeof(WINDOWPLACEMENT) };

它们会自动初始化为零吗?或者它取决于我正在使用哪个编译器以及它是否是调试版本?

3 个答案:

答案 0 :(得分:11)

是的,它们会自动初始化为零。

8.5.1 / 7:

  

如果初始化程序较少   列表中的成员比   聚合,然后每个成员不   明确初始化应为   价值初始化(8.5)。 [实施例:

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

使用1,ss.b初始化ss.a   “asdf”和ss.c,其值为   int()形式的表达式,即   0.]

答案 1 :(得分:1)

如果您确定尺寸是第一个元素,那就没问题。任何未在初始值设定项中获取值的成员都将归零。

答案 2 :(得分:0)

此:

WINDOWPLACEMENT wp = { X };

将所有剩余成员初始化为0(假设为POD)。

参见:8.5.1聚合[dcl.init.aggr]段落:7:

  

7如果列表中的initializer-clause少于聚合中的成员,则未明确初始化的每个成员都应进行值初始化(8.5)。

     

[例如:

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

使用1,ss.b使用“asdf”初始化ss.a,使用int()形式的表达式的值初始化ss.c,   是,0-示例]