链接属性
翻译单元
编译器在编译代码时,只会去编译.cpp格式的源文件,并且预编译器会递归的把.cpp所有#include的头文件都拷贝到.cpp文件中去,之后对这个文件再进行编译,生成二进制的.obj文件,然后链接器会将所有的obj文件进行链接,生成最终可执行文件。
所以每一个.cpp文件都是一个翻译单元。
链接属性
链接属性决定了一个变量或函数是否可以被其他文件访问。
外部链接
实体(变量、函数)在整个程序中都是可见的。它可以在一个文件中定义,然后在其他文件中使用 extern 声明来访问。
内部链接
实体只在它所在的翻译单元(即单个 .cpp文件及其包含的头文件)内部可见。其他文件无法访问它。
默认是内部链接的实体
为什么要默认内部链接:为了避免多重定义错误。
- 全局的const变量。
- 使用static修饰的全局变量和函数。
- 匿名命名空间内的所有实体。