为什么编译器会抛出这个警告:“缺less初始化程序”? 结构是否已初始化?
我正在为程序创build某种前端。 为了启动程序,我使用了CreateProcess()
,除此之外, STARTUPINFO
接收一个指向STARTUPINFO
结构体的指针。 要初始化我曾经做过的结构:
STARTUPINFO startupInfo = {0}; // Or even '\0'. startupInfo.cb = sizeof(startupInfo);
当编译与GCC的程序启用这些警告集-Wall -Wextra
它给了我一个警告说,有一个缺less的初始化指向第一行。
warning: missing initializer warning: (near initialization for 'startupInfo.lpReserved')
所以我最终做了:
STARTUPINFO startupInfo; memset(&startupInfo, 0, sizeof(startupInfo)); startupInfo.cb = sizeof(startupInfo);
这样编译器不会给出任何警告。 问题是这些初始化结构的方式有什么区别? 使用第一种方法,是不是初始化的结构? 你会推荐哪一个?
海湾合作委员会只是过分偏执 – 我认为没有理由,但是确实如此,海湾合作委员会的维护人员更了解我所做的C的细微差别。
在GCC邮件列表中查看关于这个问题的小讨论:
- http://gcc.gnu.org/ml/gcc-bugs/1998-07/msg00031.html
- http://gcc.gnu.org/ml/gcc-bugs/1998-07/msg00059.html
- http://gcc.gnu.org/ml/gcc-bugs/1998-07/msg00128.html
底线虽然 – 初始化结构只是{0}
将实际上零初始化整个事情。
C99标准在6.7.8 / 21“初始化 – Sematics”中说明如下:
如果大括号包含的列表中的初始值设定项less于聚合的元素或成员,或者用于初始化比数组中的元素大小的数组的stringstring中的较less字符,则聚合的其余部分应被隐式地初始化为具有静态存储持续时间的对象。
C90在6.5.7中有相同的表述,换句话说,C99在这里没有添加新的东西。
另外请注意,在C ++中这是扩展的,因此一个空的花括号“ {}
”将对对象执行值初始化,因为当你甚至不知道成员或成员有多less时一个types可能有。 因此,这不仅是一种好的做法,而且有时需要一个比对象可能具有的成员数量更短的初始化程序列表。
通过将结构初始化为C ++程序,可以很容易地解决这个问题
STARTUPINFO startupInfo = STARTUPINFO();
- 前几天刚刚做到了这一点
您要求尽可能多的警告使用-Wall -Wextra。
在这种情况下,你会得到一个警告,告诉你没有指定所有的字段,这是完全有效的,但可能是无意的。
您可以通过添加-Wno-missing-field-initializers来禁止此警告
这个网页详细讨论了潜在的问题: http : //ex-parrot.com/~chris/random/initialise.html
作为解决方法,我目前的解决scheme是有select地禁止这个警告:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wmissing-field-initializers" STARTUPINFO startupInfo = {0}; #pragma clang diagnostic pop
可悲的是,这只能在叮当中奏效,而且在GCC中似乎不起作用。
在C ++中,你可以使用boost::initialized_value
来摆脱这个警告。 我有警告closuresboost
; 所以我不知道这是否会导致你的情况下的任何其他警告。 这样你就不必禁用这个警告。
例:
T bla = boost::initialized_value;