我在C ++中做了很多Win32编程,许多Win32结构都有'size'(通常称为cbSize
或length
)成员作为第一个需要在相关API之前设置的元素可以打电话。例如:
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &wp);
现在,我认为将结构成员初始化为零是一个好习惯,我可以这样做:
WINDOWPLACEMENT wp = { };
或
WINDOWPLACEMENT wp = { 0 };
但是,如果我像这样初始化第一个成员,那么结构的其他成员会发生什么:
WINDOWPLACEMENT wp = { sizeof(WINDOWPLACEMENT) };
它们会自动初始化为零吗?或者它取决于我正在使用哪个编译器以及它是否是调试版本?
答案 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-示例]