【发布时间】:2019-05-30 00:22:16
【问题描述】:
考虑这个简单的类
class A
{
public:
int a;
};
如您所见,int a 从未被初始化。在这种情况下,我想得到一个错误或至少是警告。我正在使用Xcode 和GNU++11[-std=gnu++11] C++ 方言。有没有可能?
更新:
首先我创建了一个A 的实例并使用了它的a 成员,但仍然没有收到任何警告:
A a;
std::cout << a.a;
我还研究了Easy way to find initialized member variables,它建议添加-Weffc++ 标志。我尝试通过 Xcode 构建设置中的自定义编译器标志添加它(这样做是错误的方法吗?我不确定)但它没有工作
【问题讨论】:
-
成员变量是否未初始化取决于您如何初始化类的实例。如果您使用aggregate initialization(如
A a{123};),那么a将被初始化。 -
由于没有
A类的实例,因此这里没有什么要初始化的。请注意,即使a没有在类主体中初始化,它并不意味着它不会在创建类实例时被初始化,例如可以写A aa{3}; -
VTT 所说的。如果您尝试创建
A的实例并使用.a而不先初始化它,则 GCC 会发出警告:coliru.stacked-crooked.com/a/f2a20e487219a19a -
你很可能使用
clang而不是gcc(gcc在 OS X 上通常是clang的别名),它不会警告你这种未初始化的成员,甚至打开所有警告标志。