初始化对象时,{0}意味着什么?

{0}用于初始化一个对象时,它意味着什么? 我无法在任何地方找到任何对{0}引用,并且由于Google搜索的大括号无效。

示例代码:

SHELLEXECUTEINFO sexi = {0}; // what does this do?
sexi.cbSize = sizeof(SHELLEXECUTEINFO);
sexi.hwnd = NULL;
sexi.fMask = SEE_MASK_NOCLOSEPROCESS;
sexi.lpFile = lpFile.c_str();
sexi.lpParameters = args;
sexi.nShow = nShow;

if(ShellExecuteEx(&sexi))
{
    DWORD wait = WaitForSingleObject(sexi.hProcess, INFINITE);
    if(wait == WAIT_OBJECT_0)
        GetExitCodeProcess(sexi.hProcess, &returnCode);
}

没有它,上面的代码将在运行时崩溃。


这里发生的事情叫做聚合初始化。 以下是来自ISO规范第8.5.1节的聚合(缩写)定义:

聚合是一个没有用户声明构造函数的数组或类,没有私有或受保护的非静态数据成员,没有基类,也没有虚函数。

现在,使用{0}来初始化一个像这样的聚合,基本上就是把整个东西都变成0的技巧。 这是因为在使用聚合初始化时, 您不必指定所有成员 ,并且规范要求所有未指定的成员都默认初始化,对于简单类型,这意味着设置为0

以下是规范中的相关引用:

如果列表中的初始化程序比聚合中的成员少,那么未明确初始化的每个成员都应该默认初始化。 例:

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

初始化ss.a1ss.b"asdf" ,和ss.c与以下形式的表达式的值int()即, 0

你可以在这里找到关于这个主题的完整规范


有一点需要注意的是,这种技术不会将填充字节设置为零。 例如:

struct foo
{
    char c;
    int  i;
};

foo a = {0};

不一样:

foo a;
memset(&a,0,sizeof(a));

在第一种情况下,c和i之间的填充字节未初始化。 你为什么要在意? 那么,如果您将这些数据保存到磁盘或通过网络或其他方式发送,则可能存在安全问题。


请注意,一个空的聚合初始值设定项也适用:

SHELLEXECUTEINFO sexi = {};
char mytext[100] = {};
链接地址: http://www.djcxy.com/p/12523.html

上一篇: What does {0} mean when initializing an object?

下一篇: Java: Prefix/postfix of increment/decrement operators?