Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有外部链接的类具有具有内部链接的基_C++ - Fatal编程技术网

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; /* ... */ };