gpt4 book ai didi

c++11 - 为什么我得到 "warning: missing initializer for member"? [-Wmissing-field-initializers]

转载 作者:行者123 更新时间:2023-12-04 13:19:22 36 4
gpt4 key购买 nike

我想知道为什么我在一种情况下收到关于初始化的警告,而在另一种情况下却没有。该代码位于C++源文件中,并将GCC 4.7与-std=c++11结合使用。

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]

我已经阅读了 How should I properly initialize a C struct from C++?Why is the compiler throwing this warning: "missing initializer"? Isn't the structure initialized?http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36750之类的错误报告。我不明白为什么未初始化的结构不生成警告,而初始化的结构却生成警告。
为什么未初始化的结构不生成警告;为什么初始化的结构会生成警告?

最佳答案

这是一个简单的示例:

#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: In function ‘int main()’:
missing.cpp:9:11: warning: missing initializer for member 'S::b' [-Wmissing-field-initializers]



程序打印:

s.a = 1, s.b = 0



警告只是来自编译器的提醒,S有两个成员,但是您仅显式初始化了其中一个,另一个将被设置为零。如果这是您想要的,则可以放心地忽略该警告。

在这样一个简单的示例中,它看起来很傻又烦人。如果您的结构中有很多成员,那么此警告可能会有所帮助(捕捉错误:错误地估计字段或错别字的数量)。

Why is the uninitialized structs not generating a warning?



我想这只会产生太多警告。 毕竟,这是合法的,并且如果您使用未初始化的成员,则仅是一个错误。例如:
int main() {
S s;
std::cout<<"s.a = "<<s.a<<", s.b = "<<s.b<<std::endl;
}

missing.cpp: In function ‘int main()’:
missing.cpp:10:43: warning: ‘s.S::b’ is used uninitialized in this function [-Wuninitialized]
missing.cpp:10:26: warning: ‘s.S::a’ is used uninitialized in this function [-Wuninitialized]



即使它没有警告我有关 s的未初始化成员,它也警告我有关使用未初始化的字段。一切皆好。

Why is the initialized structs generating a warning?



仅当您显式但部分地初始化字段时,它才会警告您。提醒您,该结构具有比您枚举更多的字段。在我看来,该警告的实用性令人怀疑:它确实会产生过多的错误警报。好吧,由于某种原因默认情况下未打开它...

关于c++11 - 为什么我得到 "warning: missing initializer for member"? [-Wmissing-field-initializers],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21658485/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com