《大规模 C++ 软件开发》读书笔记
不知道是不是记忆力变差了, 好多东西学会了过一阵就忘了
哪怕实践过也不过是重新学的时候会快一点而已
链接属性
- 外部链接意味着,一个名字所指代的实体可以通过其他翻译单元中的声明被引用。
1 | // a.cpp |
1 | // b.cpp |
- 内部链接意味着,同一个翻译单元内的不同声明可以指代同一个实体,但这种身份不会通过该名字延伸到其他翻译单元。
匿名 namespace 用来平替 static 可能更好用
1 | namespace { |
- 无链接意味着,这个名字不具有跨声明建立同一实体身份的链接属性。
1 | void f() { |
绑定
我们将物理链接的过程成为绑定, 与逻辑链接区分
- 内部绑定: 编译翻译单元的使用时就已确定这个名字的定义, 不需要跨翻译单元工作
- 外部绑定: 需要跨翻译单元, 不能重复定义
- 双重绑定: 需要跨翻译单元, 但可以重复定义, 例如
inline修饰的函数和变量
不光是 inline 修饰的函数和变量,
类类型定义、函数模板定义、类模板定义
都可以多个翻译单元有相同定义而不违反 ODR
这一设计主要都是为了能让多个要用到 这个类 (的成员)、模板实例化 的地方都能够得到足够的信息——模板实例化是在编译阶段进行的, 所以需要完整的实现, 因为链接器是比较独立于 C++ 语言之外的
需要注意的是, 模板函数的显式特化并不是模板函数, 而是普通的函数, 所以也具有外部绑定