避免仅在源文件中定义的 类 的弱虚表警告

Avoid weak-vtable warnings for classes only defined in a source file

我明白 class class 至少需要一个在源文件中定义的虚函数 (out of line),否则 vtable 将需要插入到每个目标文件中。

我有以下情况:

//foo.cpp

struct Foo {
virtual int Bar() { return 1; }
virtual ~Foo() = default;
};

Qt Creator (4.5.2) 中的 clang 代码模型为 Foo 发出 -Wweak-table 警告。
严格来说警告是正确的,因为 vtable 将包含在每个翻译单元中。实际上,它毫无价值,因为无论如何 vtable 只会在 foo.o 中发出。

如何仅对源文件中定义的 classes 禁用 -Wweak-vtables?

不太确定,但在我工作的地方,我们有一些在本地化源中禁用警告的做法。

在windows下:

#pragma warning(push)
#pragma warning(disable : 4820)
//Rest of your includes (cstdio, vector...)
#pragma warning(pop) //For /Wall

在 gcc 下像:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
//Rest of your includes (cstdio, vector...)
#pragma GCC diagnostic pop

事实证明,standalone clang 默认情况下是正确的,只有 Qt creator 中的 clang 代码模型显示无用警告。它已被报告为 QTCREATORBUG-19741,因此除了等待更新的 Qt Creator 版本之外别无他法。