《大规模 C++ 软件开发》读书笔记

不知道是不是记忆力变差了, 好多东西学会了过一阵就忘了

哪怕实践过也不过是重新学的时候会快一点而已

链接属性

  1. 外部链接意味着,一个名字所指代的实体可以通过其他翻译单元中的声明被引用。
1
2
// a.cpp
int value = 42;
1
2
3
4
5
6
// b.cpp
extern int value;

int main() {
return value;
}
  1. 内部链接意味着,同一个翻译单元内的不同声明可以指代同一个实体,但这种身份不会通过该名字延伸到其他翻译单元。

匿名 namespace 用来平替 static 可能更好用

1
2
3
namespace {
int counter = 0;
}
  1. 无链接意味着,这个名字不具有跨声明建立同一实体身份的链接属性。
1
2
3
4
5
6
7
8
void f() {
int x = 1;

}

void g() {
int x = 1;
}

绑定

我们将物理链接的过程成为绑定, 与逻辑链接区分

  1. 内部绑定: 编译翻译单元的使用时就已确定这个名字的定义, 不需要跨翻译单元工作
  2. 外部绑定: 需要跨翻译单元, 不能重复定义
  3. 双重绑定: 需要跨翻译单元, 但可以重复定义, 例如 inline 修饰的函数和变量

不光是 inline 修饰的函数和变量, 类类型定义、函数模板定义、类模板定义 都可以多个翻译单元有相同定义而不违反 ODR

这一设计主要都是为了能让多个要用到 这个类 (的成员)、模板实例化 的地方都能够得到足够的信息——模板实例化是在编译阶段进行的, 所以需要完整的实现, 因为链接器是比较独立于 C++ 语言之外的

需要注意的是, 模板函数的显式特化并不是模板函数, 而是普通的函数, 所以也具有外部绑定