干净地压制gcc的'final`建议警告(`-Wsuggest-final-types`和`-Wsuggest-final-methods`)

时间:2016-02-10 09:52:45

标签: c++ gcc warnings final

我喜欢使用-Wsuggest-final-types and -Wsuggest-final-methods编译我的代码,以便警告可以使用final关键字来允许编译器更积极地优化的机会。

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

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

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

理想情况下,我正在寻找可以在类/方法声明中添加/附加的non-final关键字或属性。

1 个答案:

答案 0 :(得分:2)

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

#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))