【发布时间】:2010-12-05 01:36:57
【问题描述】:
我正在为一个程序创建某种前端。为了启动程序,我使用了调用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);
这样编译器不会给出任何警告。 问题是,这些初始化结构的方式有什么区别? 使用第一种方法,结构不是初始化了吗? 你会推荐哪一个?
【问题讨论】:
-
警告就是:警告。在这个特定的场合可以忽略这个特定的警告。在以下情况下,编译器会发出警告以帮助您:
struct struct_with_four_fields x = {1, 2, 3};其中只有 4 个成员中的 3 个被初始化。 -
在我之前的评论中,第 4 个成员被初始化为 0。
-
警告缺少初始化器通常不是不合理的;如果您有一个包含 4 个成员的结构并且您只为其中的 3 个提供了初始化程序,那么这很可能是一个错误。但是
{ 0 }是一个通用且定义明确的习惯用法,用于将所有成员初始化为零(为每个子成员递归定义)——这就是为什么后来的 gcc 版本已被修改为不对这种特殊情况发出警告。 -
@KeithThompson 你在说什么? I am using gcc 4.8.2,自从这个问题五年过去了。附:还有一封邮件,最后我想链接它,但令我惊讶的是它不见了。可能邮件服务器没有保存所有的邮件,很遗憾,邮件对再次遇到问题的人有用。
-
@Hi-Angel:当我在 Solaris 上使用 gcc-4.8.1 编译一个小程序时,我收到“警告:缺少初始化程序”。当我在 Linux Mint 上使用 gcc-4.8.2 编译相同的程序时,我没有收到警告。顺便说一句,message you linked to 中的行
obj = {0};不是有效的 C,gcc 4.8.2 将其作为语法错误拒绝。如果您正在编译为 C++,请记住它是一种不同的语言,并且 gcc 使用不同的前端; gcc 的 C 编译器中的修复可能适用于 g++,也可能不适用于 g++。