假设您有一个这样的结构:
struct Foo {
int a;
};
目前,我正在像这样初始化它:
Foo foo = {1};
现在,如果我添加另一个成员:
struct Foo {
int a;
int b;
}
代码仍在编译,编译器认为初始化是完全可以的。但是我希望编译器在向结构中添加新成员时产生错误。有可能吗?
答案 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) {}
};
然后您会遇到一个问题。但是也有可能使编译器对此发出警告。