Vit*_*meo 7 c++ gcc warnings final
我喜欢使用-Wsuggest-final-types和-Wsuggest-final-methods编译我的代码,以便警告final关键字可用于允许编译器更积极地优化的机会.
但有时候,建议是不正确的 - 例如,我有一个Base带有virtual ~Base()析构函数的类,在另一个项目中以多态方式使用,gcc建议我Base可以标记为final.
有没有办法"干净地"告诉编译器Base多态使用并且不应该标记为final?
我能想到的唯一方法是使用#pragma指令,但我发现它使代码混乱且难以阅读.
理想情况下,我正在寻找non-final可以在类/方法声明中添加/附加的关键字或属性.
我想出了一个基于宏的解决方案,我真的不喜欢,但它解决了问题。
#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 {} \
}; \
}
Run Code Online (Sandbox Code Playgroud)
用法:
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))
Run Code Online (Sandbox Code Playgroud)