翻译|C语言必学之内部链接和外部链接


翻译|C语言必学之内部链接和外部链接
文章图片
翻译|C语言必学之内部链接和外部链接
文章图片
翻译|C语言必学之内部链接和外部链接
文章图片
翻译|C语言必学之内部链接和外部链接
文章图片
【翻译|C语言必学之内部链接和外部链接】首先让我们定义一下:
范围:标识符的范围是程序的一部分 , 可以直接访问标识符 。 在C语言中 , 所有标识符都在词法(或静态)范围内 。
链接:链接描述了名称在整个程序或一个翻译单元中如何引用或不引用同一实体 。 以上听起来与Scope相似 , 但事实并非如此 。 要了解上述含义 , 让我们深入研究编译过程 。
翻译单元:翻译单元是一个包含源代码 , 头文件和其他依赖项的文件 。 所有这些源都组合在一个文件中 , 因为它们用于产生一个单个可执行对象 。 以有意义的方式将源链接在一起很重要 。 例如 , 编译器应该知道printf定义位于stdio头文件中 。



在C和C ++ , 即由多个源代码文件中的程序被编译一次一个 。 在编译过程之前 , 可以通过变量的作用域来描述变量 。 只有在链接过程开始时 , 链接属性才起作用 。 因此 , 范围是由编译器处理的属性 , 而链接是由链接器处理的属性 。
链接器在编译过程的链接阶段将资源链接在一起 。 链接器是一个程序 , 它将多个机器代码文件作为输入 , 并生成可执行的目标代码 。 它解析符号(即 , 获取符号的定义 , 例如“ +”等 。 )并将对象排列在地址空间中 。
链接是一个属性 , 它描述链接器应如何链接变量 。 变量应该可供另一个文件使用吗?应该只在声明的文件中使用变量吗?两者都是由链接决定的 。
因此 , 链接使您可以将每个文件的名称耦合在一起 , 范围决定了这些名称的可见性 。
有两种类型的链接:


1.内部链接:实现内部链接的标识符无法在声明它的翻译单元外部访问 。 该单元内的任何标识符都可以访问具有内部链接的标识符 。 它由关键字实现static 。 内部链接的标识符存储在RAM的初始化或未初始化段中 。 (注意: static 在引用范围方面也有含义 , 但此处不做讨论) 。
一些例子:


上面的代码实现了对标识符的静态链接animals 。 考虑Feed.cpp位于同一翻译单元中 。


首先编译Animals.cpp , 然后再编译Feed.cpp , 我们得到:输出:5   8    2 。
现在 , 考虑Feed.cpp位于另一个翻译单元中 。 仅当我们使用时 , 它才会像上面那样编译和运行#include \"Animals.cpp\" 。
考虑位于第三个翻译单元中的Wash.cpp 。


编译后 , 我们得到:输出:5  8  have fun   10 。
这使我们得出以下结论:每个翻译单元都访问自己的副本animals 。 这就是为什么我们必须animals为= 8 Animals.cpp , animals= 2Feed.cpp和animals= 10 Wash.cpp 。 一份文件 。 此行为会消耗内存并降低性能 。


推荐阅读