WCHAR wszFoo[CONSTANT_BAR] = {0};
我从未在C++语言中看到过像{0}这样的东西。我不知道如何在网上搜索类似问题。它是什么?
WCHAR wszFoo[CONSTANT_BAR] = {0};
我从未在C++语言中看到过像{0}这样的东西。我不知道如何在网上搜索类似问题。它是什么?
缺少初始化值则使用零
如果明确指定了数组的大小,但是指定了一个较短的初始化列表,则未指定的元素将被设置为零。
float pressure[10] = {2.101, 2.32, 1.44};
这不仅初始化了前三个值,而且所有剩余的元素都设为0.0。要将数组初始化为全零,请仅初始化第一个值。
这是在初始化一个数组。
float p1[1000]; // No intitialization.
float p2[1000] = {0.0}; // All 1000 values initialized to zero.
更多内容请参见:C++笔记:数组初始化
。$8.5.1/7 -
“如果在初始化列表中的初始值少于聚合体中的成员数,则每个未明确初始化的成员都应该是值初始化(8.5)。”
这意味着有一个显式请求将第一个元素初始化为0。由于剩余元素没有指定初始化程序,因此它们被值初始化。在WCHAR的情况下,这意味着它们被初始化为0。
什么是值初始化?标准在$8.5中说了什么(斜体为我的添加)
对于类型T的值初始化对象意味着:
- 如果T是具有用户声明构造函数(12.1)的类类型(clause 9),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是非法的);
- 如果T是没有用户声明构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都会被值初始化;
- 如果T是数组类型,则每个元素都被值初始化;
- 否则,对象被零初始化 <------ WCHAR适用于此处
对于类型T的零初始化对象意味着:
- 如果T是标量类型(3.9),则将对象设置为转换为T的值0(零);<------ WCHAR适用于此处
- 如果T是非联合类类型,则每个非静态数据成员和每个基类子对象都被置零;
- 如果T是联合类型,则对象的第一个命名数据成员89)被置零;
- 如果T是数组类型,则每个元素都被置零;
- 如果T是引用类型,则不进行初始化。
wszFoo
的所有元素初始化为零。
memset
(或ZeroMemory
或SecureZeroMemory
),或一个空括号集合。添加额外的零只会导致混淆。+1 - Billy ONeal