C ++
关于此主题的前几个问题:
这是我最近问的后续问题:clang:没有线外虚拟方法定义(纯粹的抽象C ++类),它被标记为这个问题的重复:clang的-Wweak-虚函数表? 我不认为这回答了我的问题,所以在这里我将重点放在让我感到困惑并且尚未得到解答的事情上。
我的场景:
我正在尝试使用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 -Wweak-vtables -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]
当A类不是纯粹的抽象时,上面的代码可以很好地构建。 下面的代码不会发出警告,唯一的变化是类A不再抽象:
test2.h:
class A
{
public:
A();
virtual ~A();
};
test2.cc
#include "test2.h"
A::A() {;}
A::~A() {;}
我的问题
纯粹的抽象类有什么特别之处,以上代码在Clang中触发警告?
具有虚拟方法的类总是需要发出一个vtable。 编译器需要指示存储vtable的位置 - 通常位于实现其第一个函数的对象中。
纯粹的抽象类有什么特别之处? 由于它们没有方法,因此编译器必须在每个翻译单元中输出一个vtable,以便每个翻译单元可以引用纯粹的抽象基本类型。 这就是警告告诉你的。
例如,如果您想避免在非常低的内存环境下复制该内存,或者如果您查看对象并想知道为什么在该地点附近有多个vtable副本,您可能会关心它。
无论如何,您可以将多态指针指向A
对象意味着编译器必须发出一些关于该类型的信息 - vtable。
如果您喜欢,您可以使用Clang的诊断编译指令禁用该块的警告:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wweak-vtables"
class A {
public:
virtual void doSomething() = 0;
virtual ~A() = 0;
};
#pragma clang diagnostic pop
这是你的困境:要么让课堂非纯粹抽象,要么关闭警告。 根据您的要求,您可能更喜欢一个或另一个,但与所有警告一样,您应该仔细考虑。
链接地址: http://www.djcxy.com/p/84015.html上一篇: c++