避免仅在源文件中定义的 类 的弱虚表警告
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 版本之外别无他法。
我明白 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 版本之外别无他法。