C++ 为什么MingW4.9显示根据标准正确的代码缺少初始值设定项警告
我有MS windows的以下代码: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,规范中没有任何更改,它只是一个警告,
#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]