c++ - 干净地抑制 gcc 的 `final` 建议警告 (`-Wsuggest-final-types` 和 `-Wsuggest-final-methods` )

标签 c++ gcc warnings final

我喜欢使用 -Wsuggest-final-types 编译我的代码和 -Wsuggest-final-methods以便在可能使用 final 关键字以允许编译器更积极地优化的机会时收到警告。

不过,有时这些建议是不正确的 - 例如,我有一个类 Base 和一个 virtual ~Base() 析构函数,在另一个项目中以多态方式使用, gcc 建议我可以将 Base 标记为 final

有没有办法“干净地”告诉编译器 Base 是多态使用的,不应该被标记为 final

我能想到的唯一方法是使用 #pragma 指令,但我发现它会使代码困惑且难以阅读。

理想情况下,我正在寻找可以添加到类/方法声明前/后的非最终关键字或属性。

最佳答案

我提出了一个我非常不喜欢的基于宏的解决方案,但它解决了问题。

#define MARK_NONFINAL_CLASS(base)                              \
    namespace SOME_UNIQUE_NAME                                 \
    {                                                          \
        struct [[unused]] temp_marker final : base             \
        {                                                      \
        };                                                     \
    }

#define MARK_NONFINAL_METHOD(base, return_type, method)                  \
    namespace SOME_UNIQUE_NAME                                           \
    {                                                                    \
        struct [[unused]] temp_marker final : base                       \
        {                                                                \
            inline return_type [[unused]] method override {}             \
        };                                                               \
    }

用法:

class Base
{
    virtual ~Base()
    {
    }

    virtual int a(float f)
    {
    }
    virtual void b(double)
    {
    }
};

MARK_NONFINAL_CLASS(Base)
MARK_NONFINAL_METHOD(Base, int, a(float))
MARK_NONFINAL_METHOD(Base, void, b(double))

关于c++ - 干净地抑制 gcc 的 `final` 建议警告 (`-Wsuggest-final-types` 和 `-Wsuggest-final-methods` ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35311799/

相关文章:

gcc - 我可以在 Windows7x64 (MSVC) 和 Linux64 (GCC4.8.2) 的 .cu 文件 (CUDA5.5) 中使用 C++11 吗?

java - 为什么 Jena 2.11.0 会出现这些警告?

c++ - VC++ 警告 C4356 : static data member cannot be initialized via derived class

c++ - calltree for c++ 程序到标准库

c++ - unique_ptr 与 shared_ptr 中的删除器类型

c - 我不小心换了一个shell命令。有什么办法可以恢复我的源代码吗?

hadoop - $HADOOP_HOME 已弃用

c++ - 将派生类分配给基类

c++ - 如何检测可变函数参数列表中给定类型参数的可用性,并在处理完所有参数后采取行动

c - 如何在嵌入式系统中安全地执行类型双关