6.6 - 内部链接
Key Takeaway
- 全局变量和函数的表示符,链接属性为 内部链接(internal linkage) 或 内部链接(external linkage)
- 具有内部链接属性的标识符,在一个文件内可见可用,但是在其他文件中不可访问
static
可以将全局变量声明为内部变量,Const
和constexpr
的全局变量则默认具有内部链接属性- 存储类型说明符可以同时设置变量的链接属性和存储持续时间(但不是其作用域),最常用的有
static
,extern
, andmutable
。 - 定义在不同文件中的内部变量是独立的实体,因此不违反单一定义规则
- 链接是标识符的属性(而不是变量的属性)
- 函数标识符默认是外部链接,可以通过
static
关键字修改为内部链接,此时函数只能在文件内部使用
在6.3 - 局部变量中我们讲过,标识符的链接属性决定了变量的多个声明是否指的是同一个对象。同时我们也介绍了局部变量的链接属性为无链接。
全局变量和函数的标识符的链接属性可以是 内部链接(internal linkage) 或 外部链接(external linkage) 。本节课会针对内部链接进行详细介绍,而外部链接会放到下一节课——6.7 - 外部链接和变量前向声明。
具有内部链接属性的标识符,在一个文件内可见可用,但是在其他文件中不可访问(即不会暴露给链接器)。这意味着,如果两个文件中具有同名的标识符,且它们具有内部链接,这些标识符会被看做是互相独立的。
全局变量和内部链接
具有内部链接的全局变量,有时候也称为内部变量。
通过static
关键字,我们可以将一个非常的全局变量声明为内部变量。
1 2 3 4 5 6 7 8 9 |
|
Const 和 constexpr 类型的全局变量默认具有内部链接属性(因此不需要关键字 static
,即使用了也会被忽略)。
下面的例子展示了多个文件中具有内部变量的情况:
a.cpp | |
---|---|
1 |
|
main.cpp | |
---|---|
1 2 3 4 5 6 7 8 9 10 |
|
打印结果:
1 |
|
因为 g_x
is internal to each file, main.cpp
has no idea that a.cpp
also has a variable named g_x
(and vice versa).
扩展阅读
static
变量是一个存储类型说明符,它可以同时设置变量的链接属性和存储持续时间(但不是其作用域)。最常用的[[storage-class-specifier|存储类型说明符]]有static
, extern
, and mutable
。存储类型说明符这个词常被用在技术文档中。
单一定义规则和内部链接
在 2.7 - 前向声明和定义 中我们介绍了 单一定义规则(one-definition-rule) ,即一个对象或者函数在一个函数或程序中不能被定义一次以上。
但是,需要注意的是,定义在不同文件中的内部对象(和函数)被看做是独立的实体(即使它们的名字和类型是相同的),因此这并不会违反单一定义规则。每个内部对象仍然只被定义了一次。
具有内部链接的函数
因为链接是标识符的属性(而不是变量的属性),所以函数的表示符同样具有链接属性。函数默认是外部链接的,但是也可以用static
修改为内部链接:
add.cpp | |
---|---|
1 2 3 4 5 6 |
|
main.cpp | |
---|---|
1 2 3 4 5 6 7 8 9 10 |
|
程序无法链接,add
在add.cpp
以外的地方不能被访问。
小结
1 2 3 4 5 6 7 8 9 |
|
我们会在 6.11 - 作用域和链接小结中对相关内容进行更详细的总结。