我正在为程序创建某种前端.要启动程序,我正在使用调用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++中,这是扩展的,因此一组空的大括号" {}"将对对象执行值初始化,因为有些情况(如模板)甚至不知道成员或类型的成员数量可能有.因此,不仅是良好的实践,而且有时必须使初始化列表短于对象可能具有的成员数.
dmi*_*gov 17
通过初始化结构,可以很容易地在C++程序中为GCC修复此问题
STARTUPINFO startupInfo = STARTUPINFO();
Run Code Online (Sandbox Code Playgroud)
eco*_*tax 13
您使用-Wall -Wextra要求尽可能多的警告.
在这种情况下,您会收到一条警告,告诉您未指定所有字段,这些字段完全有效,但可能是无意的.
您可以通过添加-Wno-missing-field-initializers来抑制此警告
该网页非常详细地讨论了基本问题: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)
可悲的是,这只适用于铿锵声,似乎不适用于海湾合作委员会.