![]() |
1
1
链接器通常不涉及内部链接或不涉及链接——它们完全由编译器在链接器进入实际操作之前解决。 内部链接意味着同一翻译单元中不同作用域的两个声明可以引用同一事物。 无连接没有链接意味着同一翻译单元中不同作用域的两个声明不能引用同一个对象。 所以,如果我有这样的东西:
…没有其他声明
内部连接内部链接意味着同一翻译单元中不同作用域的声明可以引用同一对象。例如:
假设我们把它们放在一个文件中(也就是说,它们最终作为一个翻译单元),两个文件中的声明
例如,考虑如下代码:
这将打印:
…因为
链接器在这里的参与可以(通常是)与在无链接情况下几乎相同——变量
我们可以在生成的代码中看到这一点。例如,如果我们用gcc编译上面的代码,则
f:
这是
克:
所以这基本上就是
重要的是代码引用了
链接器并没有真正参与,因为它看到的只是这个文件为一个静态分配的变量请求了空间。它为它腾出了空间,但不必做任何事
|
![]() |
2
3
就C++本身而言,这并不重要:唯一重要的是系统作为一个整体的行为。不应链接没有链接的变量;不应跨翻译单元链接具有内部链接的变量;应跨翻译单元链接具有外部链接的变量。(当然,作为编写C++代码的人,您必须遵守所有的代码。 你的 约束也一样。) 然而,在编译器和链接器程序套件中,我们当然 做 必须关心这个。达到预期结果的方法由我们决定。一种传统的方法非常简单:
如果您有一个Linux或类Unix系统,请运行
|
![]() |
3
1
根据C标准,
术语“linkage”似乎相当合适——同一标识符的不同声明是 链接的 使它们一起引用同一个对象或函数。作为所选择的术语,一个真正实现链接的程序通常被称为“链接器”,这是很自然的。
链接器不必对没有链接的标识符执行任何操作。对象标识符的每一个这样的声明都声明一个不同的对象(函数声明总是有内部或外部链接)。
链接器也不一定对具有内部链接的标识符执行任何操作,因为编译器通常可以对这些标识符执行所有需要执行的操作。然而,具有内部链接的标识符可以在同一翻译单元中多次声明,这些标识符都指同一对象或函数。最常见的情况是
文件范围变量也可以具有内部链接和多个声明,这些声明都链接到引用同一对象,但多个声明部分对变量没有那么有用。 |
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |