范围和链接有啥区别?

Posted

技术标签:

【中文标题】范围和链接有啥区别?【英文标题】:What is the difference between scope and linkage?范围和链接有什么区别? 【发布时间】:2014-12-22 04:30:02 【问题描述】:

我尝试了不同的网站,但我不明白。能用简单的英文解释一下吗?

【问题讨论】:

来自 C 标准(或者更确切地说,一些 C99 草案 N1570)中的一个令人惊讶的简单声明,6.2.2/1“可以使在不同范围或同一范围内多次声明的标识符通过称为链接的过程引用相同的对象或函数。” @dyp: N1570 是 C11 的草案,而不是 C99。 @dyp 好吧,我在这里找到了msdn.microsoft.com/en-us/library/teta4z44.aspx,然后它说“链接确定程序中可以引用标识符的部分(它的“可见性”)。所以它将可见性(我理解的是范围)与链接混合在一起。我是一个初学者,这很令人困惑。 【参考方案1】:

"scope" 是编译器的命名空间; “链接”是关于编译单元的。

我再解释一下:在函数中声明的变量具有该函数的范围,即它仅在该函数中可见。在源文件中声明为静态的变量只能由该源文件(以及所有包含的文件!)中的代码看到。变量也可以具有全局范围:它们可以在源文件中被引用,但不在该源文件中声明(分配),而是在另一个源文件中声明。

我们应该说“编译单元”而不是“源文件”,因为它是正在编译的 C 源文件以及所有包含的文件。范围是指编译器可以在编译单元中“看到”的所有内容。这些是命名空间。

一个项目编译后有多个目标文件,每个编译单元一个。每个都可以引用未在编译单元中声明的使用的变量。链接器现在必须解析目标文件之间的这些引用:链接。

这也适用于函数。

【讨论】:

【参考方案2】:

继续阅读您的页面 (http://msdn.microsoft.com/en-us/library/teta4z44.aspx)。这是关于翻译单元(源文件)之间对象的可见性。它首先谈到“内部链接”:定义为static 的对象,对翻译单元来说是唯一的,但在整个过程中都可用。

接下来讨论“外部链接”:未声明static 的类似级别对象。这些在翻译单元之间共享。

最后,“无链接”:一个对象,如函数中的变量,未声明为extern,它是该范围唯一的。

如果您点击页面底部的链接,一切都会得到解释。

【讨论】:

以上是关于范围和链接有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

张量流中名称范围和变量范围有啥区别?

ColdFusion 中的 THIS 范围和 APPLICATION 范围有啥区别?

春季请求和会话范围有啥区别?

非唯一键查找和索引范围扫描有啥区别?

AngularJS指令范围内的'@'和'='有啥区别?

点运算符和范围解析运算符有啥区别