【问题标题】:How to make C++ compiler produce error or warning when an instance variable is uninitialized?当实例变量未初始化时,如何使 C++ 编译器产生错误或警告?
【发布时间】:2019-05-30 00:22:16
【问题描述】:

考虑这个简单的类

class A
{
 public:
    int a;
};

如您所见,int a 从未被初始化。在这种情况下,我想得到一个错误或至少是警告。我正在使用XcodeGNU++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 而不是gccgcc 在 OS X 上通常是clang 的别名),它不会警告你这种未初始化的成员,甚至打开所有警告标志。

标签: c++ xcode gnu


【解决方案1】:

GCC 提供了-Wuninitialized 编译器选项,用于警告未初始化的变量。

这适用于您的情况。见演示here

【讨论】:

  • 感谢您的回复,但现在我的问题是如何在 Xcode 中启用它?我通过自定义编译器标志将此选项添加到其他 C++ 标志和其他警告标志,但它不起作用
  • 我对 Xcode 不熟悉。可能发生的情况是,此特定选项以某种方式被其他选项取代。您可以尝试删除除-Wuninitialized 之外的所有其他选项并查看它是否有效?
  • @AndreyChernukha Xcode 在 Apple Clang 警告所有语言部分中有一个未初始化的变量构建设置。如果您开始在构建设置编辑器的搜索字段中输入单词uninitialized,您应该能够轻松找到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2016-08-12
  • 1970-01-01
相关资源
最近更新 更多