我正在为程序创建某种前端。要启动程序,我正在使用调用CreateProcess()
,其中接收一个指向STARTUPINFO
结构。要初始化我曾经做过的结构:
STARTUPINFO startupInfo = {0}; // Or even '\0'.
startupInfo.cb = sizeof(startupInfo);
使用 GCC 编译程序时启用这些警告集-Wall -Wextra
它给了我一个警告,说缺少指向第一行的初始化程序。
warning: missing initializer
warning: (near initialization for 'startupInfo.lpReserved')
所以我最终做了:
STARTUPINFO startupInfo;
memset(&startupInfo, 0, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
这样编译器就不会给出任何警告。
问题是,这些初始化结构的方式有什么区别?
使用第一种方法,结构体不是已经初始化了吗?
您会推荐哪一款?
GCC 只是过于偏执 - 在我看来没有充分的理由,但是 GCC 维护者确实比我更了解 C 的细微差别。
请参阅 GCC 邮件列表上有关该问题的小讨论主题:
-
缺少初始化警告 http://gcc.gnu.org/ml/gcc-bugs/1998-07/msg00031.html1998年7月1日。 1/3。
-
缺少初始化警告 http://gcc.gnu.org/ml/gcc-bugs/1998-07/msg00059.html1998年7月2日。 2/3。
-
缺少初始化警告 http://gcc.gnu.org/ml/gcc-bugs/1998-07/msg00128.html1998年7月2日。 3/3。
但底线是——初始化结构{0}
实际上会将整个事情初始化为零。
The C99 https://en.wikipedia.org/wiki/C99标准在 6.7.8/21“初始化 - 语义”中规定了以下内容:
如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符少于数组中的元素,则聚合的其余部分应与具有静态存储持续时间的对象一样隐式初始化。
C90 在 6.5.7 中说的基本相同,但措辞略有不同(换句话说,C99 没有在这里添加新内容)。
另请注意,在 C++ 中,这被扩展为一组空大括号,“{}
“,会对对象执行值初始化,因为在某些情况下(例如模板),您甚至不知道类型可能有哪些成员或有多少个成员。因此,这不仅是一个好的实践,而且有时是必要的比对象可能拥有的成员数短的初始值设定项列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)