【发布时间】:2015-05-01 10:17:00
【问题描述】:
我正在尝试使用 Clang-3.5 编译以下简单的 C++ 代码:
test.h:
class A
{
public:
A();
virtual ~A() = 0;
};
test.cc:
#include "test.h"
A::A() {;}
A::~A() {;}
我用来编译这个的命令(Linux,uname -r: 3.16.0-4-amd64):
$clang-3.5 -Weverything -std=c++11 -c test.cc
我得到的错误:
./test.h:1:7: warning: 'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]
任何提示为什么会发出警告?虚拟析构函数根本没有内联。恰恰相反,test.cc 中提供了一个离线定义。我在这里错过了什么?
编辑
我不认为这个问题是重复的:
What is the meaning of clang's -Wweak-vtables?
正如菲利普·罗森建议的那样。在我的问题中,我特别提到了纯抽象类(建议的副本中没有提到)。我知道-Wweak-vtables 是如何与非抽象类一起工作的,我很好。在我的示例中,我在实现文件中定义了析构函数(纯抽象)。这应该可以防止 Clang 发出任何错误,即使是 -Wweak-vtables。
【问题讨论】:
-
@gha.st 确实如此,但有什么不同呢?我在实现更复杂的抽象类时遇到了这个问题,但这在这里无关紧要。上面的代码应该还是没问题的吧?
-
这不正是你在 3 小时后问的 this other question 的骗局吗?
-
@Barry 我认为这是两者中更好的问题,所以这是我赏金的。另一个问题解释说,在询问那个人时,这个人被作为另一个人的欺骗而关闭,但后来被重新打开。
-
这可以通过两种方式解决。
-
这可以通过三种方式解决。 1. 使用至少一个非内联的虚函数。只要它不是内联函数,定义一个虚拟析构函数也是可以的。 2. 禁用警告,如下所示。 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wweak-vtables" class ClassName : public Parent { ... }; #pragma clang 诊断弹出
标签: c++ clang clang++ llvm-clang