首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我会得到“警告:成员的初始化程序缺失”?

为什么我会得到“警告:成员的初始化程序缺失”?
EN

Stack Overflow用户
提问于 2014-02-09 11:27:55
回答 5查看 34.2K关注 0票数 13

为什么在一种情况下我会收到关于初始化的警告,而不是另一种呢?代码在一个C++源文件中,我在-std=c++11中使用GCC 4.7。

代码语言:javascript
运行
复制
struct sigaction old_handler, new_handler;

上面的内容不会产生任何-Wall-Wextra警告。

代码语言:javascript
运行
复制
struct sigaction old_handler={}, new_handler={};
struct sigaction old_handler={0}, new_handler={0};

以上所述产生警告:

代码语言:javascript
运行
复制
warning: missing initializer for member ‘sigaction::__sigaction_handler’ [-Wmissing-field-initializers]
warning: missing initializer for member ‘sigaction::sa_mask’ [-Wmissing-field-initializers]
warning: missing initializer for member ‘sigaction::sa_flags’ [-Wmissing-field-initializers]
warning: missing initializer for member ‘sigaction::sa_restorer’ [-Wmissing-field-initializers]

我已经阅读过https://stackoverflow.com/questions/4782628/how-should-i-properly-initialize-a-c-struct-from-chttps://stackoverflow.com/questions/1538943/why-is-the-compiler-throwing-this-warning-missing-initializer-isnt-the-stru和bug报告,比如http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36750。我不明白为什么未初始化的结构不生成警告,而初始化的结构则生成警告。

为什么未初始化的结构不生成警告;以及为什么初始化的结构生成警告?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-02-09 12:27:12

下面是一个简单的例子:

代码语言:javascript
运行
复制
#include <iostream>

struct S {
  int a;
  int b;
};

int main() {
  S s { 1 }; // b will be automatically set to 0
             // and that's probably(?) not what you want
  std::cout<<"s.a = "<<s.a<<", s.b = "<<s.b<<std::endl;
}

它发出警告:

missing.cpp:在函数‘int()’中: missing.cpp:9:11:警告:成员'S::b‘的初始化器丢失-字段初始化器

程序打印:

s.a = 1,s.b =0

警告只是来自编译器的一个提示,即S 有两个成员,但您只显式地初始化其中一个成员,而另一个成员将设置为零。如果这是你想要的,你可以安全地忽略这个警告。

在这样一个简单的例子中,它看起来既愚蠢又烦人;如果您的结构有许多成员,那么这个警告可能会有帮助(捕获bug:错误地计算字段或键入的数量)。

为什么未初始化的结构不生成警告?

--我想它只会产生太多的警告。毕竟是合法的,只有当您使用未初始化的成员时,它才是一个bug。例如:

代码语言:javascript
运行
复制
int main() {
  S s;
  std::cout<<"s.a = "<<s.a<<", s.b = "<<s.b<<std::endl;
}

missing.cpp:在函数‘int()’中: missing.cpp:10:43:警告:在此函数-Wuninitialized中使用未初始化的“s.S::b” missing.cpp:10:26:警告:在此函数-Wuninitialized中使用未初始化的“s.S::a”

尽管它没有警告我s的未初始化成员,但它确实警告我不要使用未初始化的字段。一切都很好。

为什么初始化的结构会产生警告?

只有在显式但部分初始化字段时,它才会警告您。这提醒您,结构比枚举的字段更多。在我看来,这个警告是否有用是值得怀疑的:它确实会产生太多的错误警报。嗯,在默认情况下这不是有原因的.

票数 17
EN

Stack Overflow用户

发布于 2014-02-09 12:14:49

这是个错误的警告。您确实初始化了所有的成员,但是您只是没有将每个成员的初始化器分别显示在代码中。

如果你知道你在做什么,就忽略那个警告吧。我也经常收到这样的警告,而且我经常心烦意乱。但对此我无能为力,只能忽略它。

为什么未初始化的结构没有发出警告?我不知道,但很可能是因为你没有尝试初始化任何东西。所以GCC没有理由相信你在初始化时犯了错误。

票数 5
EN

Stack Overflow用户

发布于 2016-09-28 17:19:07

你在解决症状而不是问题。根据我在第10.15节中的"https://en.wikipedia.org/wiki/Advanced_Programming_in_the_Unix_Environment“一书:

注意,我们必须使用sigemptyset()来初始化结构的sa_mask成员。我们不能保证act.sa_mask =0做同样的事情。

所以,是的,您可以沉默警告,不,这不是初始化sigaction的方法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21658485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档