多年来我一直在初始化我的struct stat
:
#include <sys/stat.h>
struct stat foo = {0};
具体而言,{0}
将所有字段设置为零,相当于memset (&foo, NULL, sizeof foo);
。现在使用C ++ 11,这已经开始产生警告:
foo.cpp:2:19: warning: missing field 'st_mode' initializer [-Wmissing-field-initializers]
struct stat s = {0};
^
这是因为C ++ 11的新初始化器语法,警告暗示我没有初始化所有成员。在C ++ 11中实例化和初始化struct stat
的首选方法是什么?
答案 0 :(得分:9)
使用
stat s{};
相反,它会在没有任何警告的情况下完成工作。它被称为对象的value-initialization。虽然在您的情况下struct stat foo = {0};
应该执行aggregate initialization(假设您的struct stat
是aggregate),其余成员也应该进行值初始化,所以从技术上讲,代码是正确的
答案 1 :(得分:1)
如果您的编译器较旧且不支持struct s{}
语法,您可能仍然可以使用C99语法:struct stat s = { .st_dev = 0 };
即使失败,或者如果您必须擦除一个,{{1}将永远有效。
答案 2 :(得分:1)
这可能源于一个误解{0}
的案例吗?您知道0
实际 意味着&#34;将所有字段设置为零&#34;,对吗?这意味着&#34;将第一个字段设置为零&#34; ...而所有其他的都留给了语言的突发奇想(正如它发生的那样,无论如何都会将它们归零)。
struct stat foo = {}
会更准确地描述您的意图,我怀疑它也会处理警告。
当然,现在,通过撰写struct stat foo{};
,您可以绝对清楚。