C++ 具有外部链接的类具有具有内部链接的基
C++ 具有外部链接的类具有具有内部链接的基,c++,C++,D(带外部链接)源自B(带内部链接) (真实场景:B是所有测试类的基础,D是X的测试。叶类是它们设计用来测试的类的朋友,允许测试它们的私有成员。X.h如下所示: #include "X.h" namespace { class B { /* ... */ }; } class D : public B { X myx; D(); }; D::D() { /* ... */ } ) 问题:编译器为D::D()发出符号是否正确?我们习惯的行为是函数被发出,除非它
D
(带外部链接)源自B
(带内部链接)
(真实场景:B是所有测试类的基础,D是X的测试。叶类是它们设计用来测试的类的朋友,允许测试它们的私有成员。X.h如下所示:
#include "X.h"
namespace {
class B { /* ... */ };
}
class D : public B {
X myx;
D();
};
D::D() { /* ... */ }
)
问题:编译器为D::D()发出符号是否正确?我们习惯的行为是函数被发出,除非它们没有外部链接。另一方面,D不能在另一个翻译单元中实例化,因为其他翻译单元不能有相同的B。您要问的问题是关于工具链的实现细节。该标准没有规定编译器“发出符号”,只是规定实现在翻译的最后阶段有一些解析外部实体引用的方法。由于任何其他翻译单元都不可能定义相同的实体
D
,因此编译器不需要将任何信息放入翻译单元中,这样就可以定位D::D
。另一方面,如果编译器确实选择发出一个符号,而另一个翻译单元也定义了D::D()
,并且链接器合并了这两个符号,则程序可能会出现异常行为,但这是可以接受的,因为程序的NDR格式不正确(意味着本标准未对该计划的实施施加任何要求)
class D;
class X { friend class D; /* ... */ };