为什么在一种情况下我会收到关于初始化的警告,而不是另一种呢?代码在一个C++源文件中,我在-std=c++11
中使用GCC 4.7。
struct sigaction old_handler, new_handler;
上面的内容不会产生任何-Wall
和-Wextra
警告。
struct sigaction old_handler={}, new_handler={};
struct sigaction old_handler={0}, new_handler={0};
以上所述产生警告:
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-c、https://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。我不明白为什么未初始化的结构不生成警告,而初始化的结构则生成警告。
为什么未初始化的结构不生成警告;以及为什么初始化的结构生成警告?
发布于 2014-02-09 12:27:12
下面是一个简单的例子:
#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。例如:
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
的未初始化成员,但它确实警告我不要使用未初始化的字段。一切都很好。
为什么初始化的结构会产生警告?
只有在显式但部分初始化字段时,它才会警告您。这提醒您,结构比枚举的字段更多。在我看来,这个警告是否有用是值得怀疑的:它确实会产生太多的错误警报。嗯,在默认情况下这不是有原因的.
发布于 2014-02-09 12:14:49
这是个错误的警告。您确实初始化了所有的成员,但是您只是没有将每个成员的初始化器分别显示在代码中。
如果你知道你在做什么,就忽略那个警告吧。我也经常收到这样的警告,而且我经常心烦意乱。但对此我无能为力,只能忽略它。
为什么未初始化的结构没有发出警告?我不知道,但很可能是因为你没有尝试初始化任何东西。所以GCC没有理由相信你在初始化时犯了错误。
发布于 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的方法。
https://stackoverflow.com/questions/21658485
复制相似问题