彻底抑制 gcc 的“最终”建议警告(“-Wsuggest-final-types”和“-Wsuggest-final-methods”)
Cleanly suppress gcc's `final` suggestion warnings (`-Wsuggest-final-types` and `-Wsuggest-final-methods`)
我喜欢使用 -Wsuggest-final-types
and -Wsuggest-final-methods
编译我的代码,以便在 final
关键字可用于允许编译器更积极地优化的机会时收到警告。
不过,有时建议是不正确的 - 例如,我有一个 class Base
和一个 virtual ~Base()
析构函数,在另一个项目中以多态方式使用,gcc 向我建议Base
可以标记为 final
.
有没有办法"cleanly"告诉编译器Base
被多态使用,不应该被标记为final
?
我能想到的唯一方法是使用 #pragma
指令,但我发现它使代码混乱且难以阅读。
理想情况下,我正在寻找可以 prepended/appended 到 class/method 声明的 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 {} \
}; \
}
用法:
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))
我喜欢使用 -Wsuggest-final-types
and -Wsuggest-final-methods
编译我的代码,以便在 final
关键字可用于允许编译器更积极地优化的机会时收到警告。
不过,有时建议是不正确的 - 例如,我有一个 class Base
和一个 virtual ~Base()
析构函数,在另一个项目中以多态方式使用,gcc 向我建议Base
可以标记为 final
.
有没有办法"cleanly"告诉编译器Base
被多态使用,不应该被标记为final
?
我能想到的唯一方法是使用 #pragma
指令,但我发现它使代码混乱且难以阅读。
理想情况下,我正在寻找可以 prepended/appended 到 class/method 声明的 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 {} \
}; \
}
用法:
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))