[英]class with external linkage has base with internal linkage
#include "X.h"
namespace {
class B { /* ... */ };
}
class D : public B {
X myx;
D();
};
D::D() { /* ... */ }
D
(具有外部链接)源自B
(具有内部链接)。
(真实场景:B 是所有测试类的基础,D 是对 X 的测试。叶子类是它们要测试的类的朋友,以允许测试它们的私有成员。Xh 看起来像这样:
class D;
class X { friend class D; /* ... */ };
)
问题:编译器为 D::D() 发出符号是否正确? 我们习惯的行为是发出函数,除非它们没有外部链接。 另一方面,D 不能在另一个翻译单元中实例化,因为其他翻译单元不能具有相同的 B。
您要问的问题是关于工具链的实现细节。 该标准没有规定编译器“发出符号”,而只是规定实现在翻译的最后阶段有一些解决外部实体引用的方法。 由于任何其他翻译单元都不可能定义相同的实体D
,因此编译器不需要将任何信息放入已翻译的翻译单元中,从而可以找到D::D
。 另一方面,如果编译器确实选择发出一个符号,并且另一个翻译单元也定义了D::D()
并且这两个符号被 linker 合并,则程序可能会出现奇怪的行为,但这是可以接受的,因为程序是格式错误的 NDR(意味着该标准没有对该程序的实施提出任何要求)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.