一般面试不太会问到,但是比较难理解透

Separate Compilation 分离编译

C++编译模型 - 预处理+编译+汇编+链接

基本概念不写了感觉都没啥可说的,记一个命名空间污染的问题
image.png
和一个内部链接,外部链接的问题
image.png
image.png

内部链接:如果一个名称对于某个编译单元来说是局部的,在链接的时候其他的编译单元无法链接到它且不会与其他的链接单元中同样的名称相冲突。例如static函数、inline函数等。
外部链接:如果一个名称对于编译单元来说不是局部的,在链接的过程中其他的编译单元可以访问它。例如全局变量和普通函数(普通函数默认为extern)。

哪些实体拥有内部链接:

  • static全局变量,static函数,友元函数定义
  • 类的定义
  • 内联函数定义
  • Union共同体定义
  • 命名空间的const常量定义
  • 枚举类型定义
  • 所有的声明(有人将其归结为无链接)

哪些实体拥有外部链接:

  • 类的非内联函数(包括成员函数和静态类成员函数的定义)
  • 类的静态成员变量的定义
  • 名字空间或全局的非静态的自由函数,非静态变量,非友元函数的定义。

       因此,拥有外部链接的实体如果被声明在头文件并且被多个.cpp文件包含,可能就会出现链接冲突错误,因为每个包含这个拥有外部链接实体的.cpp都会分配空间,当多个编译单元链接的时候,连接器就会面对多个相同的名字,无法正常链接到正确的对象。

Namespaces 命名空间


ysysys
10 声望1 粉丝