在 C 和 C++ 中,我们可以操纵变量的链接。联动分为三种:不联动、内部联动、外部联动。我的问题可能与为什么将这些称为“链接”有关(与链接器有何关系)。
我知道链接器能够处理带有外部链接的变量,因为对该变量的引用不限于单个翻译单元,因此不限于单个目标文件。通常在操作系统类(class)中讨论其实际工作原理。
但是链接器如何处理变量 (1) 没有链接和 (2) 有内部链接?这两种情况有什么区别?
最佳答案
就 C++ 本身而言,这并不重要:唯一重要的是整个系统的行为。没有链接的变量不应链接;具有内部链接的变量不应跨翻译单元链接;具有外部链接的变量应该跨翻译单元链接。 (当然,作为编写 C++ 代码的人,您也必须遵守您的所有约束。)
然而,在程序的编译器和链接器套件中,我们当然确实必须关心这一点。达到预期结果的方法取决于我们。一种传统方法非常简单:
没有链接的标识符永远不会传递给链接器。
具有内部链接的标识符也不会传递给链接器,或者传递给链接器但标记为“仅供在这个翻译单元中使用”。也就是说,它们没有
.global
声明,或者它们有.local
声明,或类似的声明。带有外部链接的标识符被传递给链接器,如果链接器看到内部链接标识符,这些外部链接符号被不同地标记,例如,有一个
.global
声明或者没有.local
声明。
如果您有类似 Linux 或 Unix 的系统,请对编译器生成的对象 (.o
) 文件运行 nm
。请注意,一些符号用大写字母注释,例如用于文本和数据的 T
和 D
:这些是全局的。其他符号用小写字母注释,如 t
和 d
:这些是局部的。因此,这些系统正在使用“将内部链接传递给链接器,但将它们标记为与外部链接不同”的方法。
关于c++ - 链接器如何处理具有不同链接的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51737002/