为什么编译器会抛出此警告:"缺少初始化程序"?结构是否初始化?

Sha*_*tia 69 c winapi gcc

我正在为程序创建某种前端.要启动程序,我正在使用调用CreateProcess(),其中包括一个指向STARTUPINFO结构的指针.要初始化我以前做的结构:

STARTUPINFO startupInfo = {0}; // Or even '\0'.
startupInfo.cb = sizeof(startupInfo);
Run Code Online (Sandbox Code Playgroud)

当用GCC编译程序启用这些警告时,-Wall -Wextra它会给我一个警告,说明缺少初始化程序指向第一行.

warning: missing initializer
warning: (near initialization for 'startupInfo.lpReserved')
Run Code Online (Sandbox Code Playgroud)

所以我最终做了:

STARTUPINFO startupInfo;
memset(&startupInfo, 0, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
Run Code Online (Sandbox Code Playgroud)

这样编译器就不会发出任何警告.问题是,这些初始化结构的方式有什么区别?使用第一种方法,是不是初始化了结构?你会推荐哪一个?

Mic*_*urr 82

海湾合作委员会只是过于偏执 - 我认为没有充分理由,但是GCC维护人员对我所做的C的细微差别了解得更多.

在GCC邮件列表中查看关于该问题的这个小讨论线程:

但最重要的是 - 用just {0}will 初始化struct 实际上是零初始化整个事物.

C99标准在6.7.8/21"初始化 - Sematics"中说明如下:

如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则聚合的其余部分应为隐式初始化与具有静态存储持续时间的对象相同.

C90在6.5.7中表示完全相同,但措辞略有不同(换句话说,C99在这里没有添加新内容).

另请注意,在C++中,这是扩展的,因此一组空的大括号" {}"将对对象执行值初始化,因为有些情况(如模板)甚至不知道成员或类型的成员数量可能有.因此,不仅是良好的实践,而且有时必须使初始化列表短于对象可能具有的成员数.

  • 我不得不添加`-Wno-missing-field-initializers`和`-Wno-missing-braces`,以便GGC停止抱怨我为我的结构添加`= {0};`.有没有人知道禁用这些警告是否会错过除`= {0};`之外的其他东西的警告? (19认同)
  • 在我的C++类中使用空括号`{}`或`{0}`初始值设定项时,即使使用gcc 4.9.3,我仍然会收到警告:/ (9认同)
  • 修复程序出现在[gcc 4.7.0](http://gcc.gnu.org/viewcvs/tags/gcc_4_7_0_release/gcc/c-typeck.c?view=co)中,但不是[gcc 4.6.3]( http://gcc.gnu.org/viewcvs/tags/gcc_4_6_3_release/gcc/c-typeck.c?view=co). (4认同)
  • @Jan Hudec:修订版 [172857](http://gcc.gnu.org/viewcvs/gcc?view=revision&revision=172857)。不幸的是,我之前评论中的 URL 不再有效。这是与修复相关的错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36750 (2认同)

dmi*_*gov 17

通过初始化结构,可以很容易地在C++程序中为GCC修复此问题

STARTUPINFO startupInfo = STARTUPINFO();
Run Code Online (Sandbox Code Playgroud)
  • 几天前就是这么做的

  • 这个答案可能存在的缺陷是,在 C++98 中,这并没有对字段进行零初始化。C++03 中添加了零初始化行为。 (2认同)

eco*_*tax 13

您使用-Wall -Wextra要求尽可能多的警告.

在这种情况下,您会收到一条警告,告诉您未指定所有字段,这些字段完全有效,但可能是无意的.

您可以通过添加-Wno-missing-field-initializers来抑制此警告


Jan*_*nX2 9

该网页非常详细地讨论了基本问题:http: //ex-parrot.com/~chris/random/initialise.html

作为解决方案,我目前的解决方案是有选择地抑制此警告:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmissing-field-initializers"
STARTUPINFO startupInfo = {0};
#pragma clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)

可悲的是,这只适用于铿锵声,似乎不适用于海湾合作委员会.

  • 我可以确认:`#pragma GCC诊断被忽略了"-Wmissing-field-initializers"`被GCC编译器4.2.1接受但什么都不做.不确定新版本的gcc (4认同)