有没有更可维护的方式来初始化结构?

时间:2019-08-29 19:12:29

标签: c++ struct initialization

假设您有一个这样的结构:

struct Foo {
   int a;
};

目前,我正在像这样初始化它:

Foo foo = {1};

现在,如果我添加另一个成员:

struct Foo {
   int a;
   int b;
}

代码仍在编译,编译器认为初始化是完全可以的。但是我希望编译器在向结构中添加新成员时产生错误。有可能吗?

1 个答案:

答案 0 :(得分:8)

您正在使用aggregate initialization,其行为是该语言的内置功能,无法更改。聚合初始化将允许您保留一些未初始化的成员。但是,您可以使用-Wmissing-field-initializers告诉GCC和Clang发出警告。您也可以使用-Werror=missing-field-initializers将其转换为错误。

您还可以通过使您的类不是聚合来禁止语言本身内部的聚合初始化,而是强迫用户使用您声明的构造函数:

struct Foo {
   int a;
   int b;
   Foo(int a, int b) : a(a), b(b) {}
};

现在Foo foo = {1};将不会编译,因为聚合初始化不适用于此处,并且构造函数的参数不足。

但是,请记住,如果您声明的构造函数未能初始化所有成员(例如 ),则您可能是偶然写了这样的内容:

struct Foo {
   int a;
   int b;
   Foo(int a, int b) : a(a) {}
};

然后您会遇到一个问题。但是也有可能使编译器对此发出警告。