为什么MinGW 4.9显示缺少根据标准正确的代码的初始化器警告

Pet*_*etr 2 c++ c++11

我有MS窗口的代码:

#include <windows.h>
#include <Shellapi.h>
#include <tchar.h>
#include <string>

void foo()
{
    SHELLEXECUTEINFO shExInfo = {0};
}
Run Code Online (Sandbox Code Playgroud)

根据这个答案,C++中{0}意味着什么?

这里发生的事情称为聚合初始化.以下是ISO规范第8.5.1节中聚合的(缩写)定义:

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

这段代码编译好,但是在MinGW 4.9上会抛出:

warning: missing initializer for member '_SHELLEXECUTEINFOW::lpParameters' [-Wmissing-field-initializers]
Run Code Online (Sandbox Code Playgroud)

对于SHELLEXECUTEINFO结构的每个部分

这是为什么?规格有什么变化吗?注意:此代码是c ++ 11

Mik*_*our 5

这是为什么?

因为您已经要求编译器警告这样的情况,或者通过指定此特定错误-Wmissing-field-initializers,或者使用-Wextra或类似的更大警告集.

通常,警告是针对有效的代码,但可能表示错误.在这种情况下,它可能表示您忘记初始化需要初始化的内容,或者只是您想要默认行为.

如果你不喜欢这个警告,并且不想更改代码以显式初始化所有字段,那么你可以用它来禁用它-Wno-missing-field-initializers.

规格有什么变化吗?

不,仅为聚合的某些字段提供初始化者仍然有效.这就是为什么它只是一个警告,而不是一个错误.

注意:此代码是c ++ 11

然后我将其更改SHELLEXECUTEINFO shExInfo {};为指定值初始化.这将零初始化所有字段,而不会触发任何警告.在较老的方言中,= {}应该具有相同的效果.