C语言 范围和联系之间有什么区别?

mgdq6dx1  于 2022-12-03  发布在  其他
关注(0)|答案(3)|浏览(191)

我试过不同的网站,但我不明白。你能用简单的英语解释一下吗?

dluptydi

dluptydi1#

“scope”是编译器的命名空间;“链接”是关于编译单元的。
我再解释一下:在函数中声明的变量具有该函数的作用域,即它只在该函数中可见。在源文件中声明为静态的变量,只有该源文件中的代码(以及所有包含的文件!)才能看到。变量也可以具有全局作用域:它们可以在源文件中被引用,但不是在该源文件中被声明(分配),而是在另一个源文件中被声明。
我们应该说“编译单元”而不是“源文件”,因为它是正在编译的C源文件,加上所有包含的文件。作用域是指编译器在编译单元中“看到”的所有内容。这些是命名空间。
编译项目后,会有许多目标文件,每个编译单元对应一个目标文件。每个目标文件都可能引用未在编译单元中声明的变量。链接器现在必须解析目标文件之间的这些引用:链接。
这也适用于函数。

8qgya5xd

8qgya5xd2#

继续阅读你的页面(http://msdn.microsoft.com/en-us/library/teta4z44.aspx)。这是关于翻译单元(源文件)之间对象的可见性。它首先讨论“内部链接”:定义为static的对象,对于翻译单元是唯一的,但在整个翻译单元中可用。
接下来就谈到“外部联动”:未声明为static的类似级别对象。这些对象在翻译单元之间共享。
最后,“不联动”:一个对象,例如函数中的变量,未声明为extern,它对于该作用域是唯一的。
如果你点击页面底部的链接,就可以了解到所有的信息。

eimct9ow

eimct9ow3#

分享我对这个问题的了解。
Scope是为了compiler的利益,而linkage是为了linker的利益。
compiler使用标识符的scope来确定在文件中的给定位置引用该标识符是否法律的。当编译器将源文件转换为目标代码时,它会记录哪些名称具有external linkage,最终将这些名称存储在目标文件中的表中。
因此,linker可以访问具有external linkage的名称;带有internal linkageno linkage名称对链接器不可见
(The以上文字摘自《C语言编程:一种现代的方法”,其中包含了一个完全相同的问题)。

相关问题