HackingC++ Learning笔记 Chapter8-Code Organization

通常面试不太会问到,可是比较难理解透面试

Separate Compilation 分离编译

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

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

内部连接:若是一个名称对于某个编译单元来讲是局部的,在连接的时候其余的编译单元没法连接到它且不会与其余的连接单元中一样的名称相冲突。例如static函数、inline函数等。
外部连接:若是一个名称对于编译单元来讲不是局部的,在连接的过程当中其余的编译单元能够访问它。例如全局变量和普通函数(普通函数默认为extern)。

哪些实体拥有内部连接:spa

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

哪些实体拥有外部连接:code

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

       所以,拥有外部连接的实体若是被声明在头文件而且被多个.cpp文件包含,可能就会出现连接冲突错误,由于每一个包含这个拥有外部连接实体的.cpp都会分配空间,当多个编译单元连接的时候,链接器就会面对多个相同的名字,没法正常连接到正确的对象。对象

Namespaces 命名空间

相关文章
相关标签/搜索