【问题标题】:Disable warning about explicitly initializing base constructor inside copy constructor of derived class禁用关于在派生类的复制构造函数中显式初始化基构造函数的警告
【发布时间】:2011-01-25 00:11:24
【问题描述】:

我正在使用启用了 -Wextra 的 g++ 版本 4.2.1。我包含了来自库的标头,并且不断收到以下关于库中类的警告,该类由 -Wextra 启用(我已将类的实际名称替换为 BaseClass):

warning: base class ‘class BaseClass’ should be explicitly initialized in the copy constructor

我的问题是:如何禁用此警告?例如,-Wextra 也启用了 -Wuninitialized,但我可以通过将 -Wno-uninitialized 作为编译器标志来覆盖这个简单的方法。关于复制构造函数的警告有什么类似的吗?我无法在 g++ 手册页或任何其他论坛帖子中找到答案。

【问题讨论】:

  • 没有看到一些示例代码,怎么可能有人知道?
  • 还要注意,禁用警告很少是一个好方法...
  • 这个警告可以说是不必要的。如果派生类的初始化列表中没有给出基类构造函数,则调用默认构造函数。在这种情况下,我知道并理解这种行为,所以我不希望发出这个警告(另外,它在我不想修改的库中)。
  • 另外,这个问题是关于编译器标志以及如何打开或关闭它们,那么为什么需要任何代码?

标签: c++ g++ warnings


【解决方案1】:

给定:

class BaseClass
{
public:
    BaseClass();
    BaseClass(const BaseClass&);
};

class DerivedClass : public BaseClass
{
public:
    DerivedClass(const DerivedClass&);
};

这个拷贝构造函数:

DerivedClass::DerivedClass(const DerivedClass& obj)
  // warning: no BaseClass initializer!
{
}

真的意思一样:

DerivedClass::DerivedClass(const DerivedClass& obj)
  // Default construct the base:
  : BaseClass()
{
}

如果这真的是你的意思,你可以像上面那样放入一个默认构造函数初始化器,警告就会消失。但是编译器建议您实际上可能想要这个:

DerivedClass::DerivedClass(const DerivedClass& obj)
  // Copy construct the base:
  : BaseClass(obj)
{
}

【讨论】:

  • 是的,没错。但是你知道有什么方法可以只禁用一个警告,同时保持所有其他警告由 -Wextra 开启吗?
  • 不,我不知道。在这种情况下,我很多时候更喜欢修复代码而不是禁用警告。
【解决方案2】:

根据http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html(搜索Wextra),这是-Wextra 的固有部分,不能单独禁用(例如,它没有通过自己的-W 选项单独列出)。

看起来您能做的最好的事情是将库的使用隔离到一个您禁用 -Wextra 的文件或根本不使用 -Wextra 并单独启用其所有组件(来自该链接) .

【讨论】:

    【解决方案3】:

    如果这不是真正的问题,并且您不能更改库(我猜您不能或者您已经这样做了),您可以使用 GCC diagnostic pragma 暂时禁用警告。

    【讨论】:

    • 有趣。当我将 -fdiagnostics-show-option 添加到编译器标志以显示控制该警告的选项时,它只会显示 -Wextra。显然,没有办法在 -Wextra 之外单独控制该警告。但是只有当编译器使用诊断编译指示检查库的头文件时,我才能关闭 -Wextra。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 2021-11-11
    • 2018-07-21
    相关资源
    最近更新 更多