如何使用C ++ 11正确初始化'struct stat'?

时间:2015-10-12 18:40:09

标签: c++ c++11

多年来我一直在初始化我的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的首选方法是什么?

3 个答案:

答案 0 :(得分:9)

使用

stat s{};
相反,它会在没有任何警告的情况下完成工作。它被称为对象的value-initialization。虽然在您的情况下struct stat foo = {0};应该执行aggregate initialization(假设您的struct stataggregate),其余成员也应该进行值初始化,所以从技术上讲,代码是正确的

答案 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{};,您可以绝对清楚。