完全取消gcc的'final'建议警告('-Wsuggest-final-types'和'-Wsugest-final-methods')

zengzsys  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(177)

我喜欢使用-Wsuggest-final-types-Wsuggest-final-methods编译代码,以便在使用final关键字时得到警告,从而允许编译器更积极地进行优化。
但是,有时候这些建议是不正确的--例如,我有一个类Base,它带有一个virtual ~Base()析构函数,而这个析构函数在另一个项目中以多态的方式使用,而gcc建议我可以将Base标记为final
有没有办法“清楚地”告诉编译器Base是以多态方式使用的,不应该标记为final
我能想到的唯一方法是使用#pragma指令,但我发现这会使代码混乱,难以阅读。
理想情况下,我会寻找一个non-final关键字或属性,它可以作为类/方法声明的前缀/后缀。

jckbn6z7

jckbn6z71#

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

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

lf3rwulv2#

请允许我提出一个建议(这就是我如何解决这些警告问题)。
GCC documentation表示:
例如,-Wsuggest-final-types对于链接时优化更有效,并且除非启用了优化,否则可能根本不会发出其他警告的某些示例。
因此,要想不再显示此警告,只需将link time optimization功能添加到命令行。

gcc -flto

相关问题