C++ 为什么MingW4.9显示根据标准正确的代码缺少初始值设定项警告

C++ 为什么MingW4.9显示根据标准正确的代码缺少初始值设定项警告,c++,c++11,C++,C++11,我有MS windows的以下代码: #include <windows.h> #include <Shellapi.h> #include <tchar.h> #include <string> void foo() { SHELLEXECUTEINFO shExInfo = {0}; } 对于SHELLEXECUTEINFO结构的每个单独部分 为什么呢?规格有什么变化吗?注意:此代码是c++11,规范中没有任何更改,它只是一个警告,

我有MS windows的以下代码:

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

void foo()
{
    SHELLEXECUTEINFO shExInfo = {0};
}
对于SHELLEXECUTEINFO结构的每个单独部分


为什么呢?规格有什么变化吗?注意:此代码是c++11,规范中没有任何更改,它只是一个警告,如果请求,将提醒您为聚合的所有字段指定显式初始值设定项

Meanfile,从语言的角度来看,你写的初始值设定项是完全合法的

根据
-Wmissing字段初始值设定项的规范,您可以将初始值设定项缩短为
={}
。最终效果将相同,但没有警告。也就是说,这是一种告诉编译器,即使存在
-Wmissing字段初始值设定项
,您也希望依赖字段的隐式值初始化的方法

但更好的办法是检查为什么启用了
-Wmissing字段初始值设定项。这是一个“极端”警告选项,它抱怨许多非常有用的编程习惯用法<代码>-Wmissing字段初始值设定项
甚至不包括在
-Wall
中。它是
-Wextra
的一部分

为什么呢

因为您已要求编译器对类似情况发出警告,可以使用
-Wmissing字段初始值设定项指定此特定错误,也可以使用
-Wextra
或类似命令指定一组更大的警告

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

如果您不喜欢此警告,并且不想更改代码以显式初始化所有字段,则可以使用
-Wno missing field initializer
禁用此警告

规格有什么变化吗

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

注意:这段代码是c++11


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

如果您使用C++11,那么您应该这样做,例如
SHELLEXECUTEINFO shExInfo{}我很困惑,因为MSVC编译器根本不会对该代码触发任何警告,这是有意义的,我相信这段代码取自msdn examples.BTW,使用SHELLEXECUTEINFO shExInfo{};产生同样的警告:/当您在十几个编译器上编译跨平台代码时,需要显式禁用它,我发现这相当复杂。(此代码块特定于windows,但编译器标志通过cmake处理)
warning: missing initializer for member '_SHELLEXECUTEINFOW::lpParameters' [-Wmissing-field-initializers]