作用域和链接有什么区别?

9
我尝试了不同的网站,但是我还是不明白。你能用简单易懂的英语解释一下吗?

2
C标准(或者说是C99草案N1570)中有一个令人惊讶的简单语句,6.2.2/1:“通过一种称为链接的过程,可以使在不同作用域或同一作用域中声明多次的标识符引用同一对象或函数。” - dyp
2
@dyp:N1570 是 C11 的草案,而不是 C99 的。 - Keith Thompson
1
@dyp 我在这里找到了 http://msdn.microsoft.com/en-us/library/teta4z44.aspx,然后它说:“链接确定程序中可以引用标识符的部分(其“可见性”)。”因此,它将可见性(我理解为作用域)与链接混淆了。我是初学者,很困惑。 - user3646717
3个回答

5
"scope"是编译器的命名空间;"linkage"则与已编译单元有关。
我来进一步解释一下:在函数中声明的变量仅在该函数内部可见,它具有该函数的作用域。在源文件中静态声明的变量只能被该源文件中的代码看到(以及所有包含的文件)。变量也可以具有全局作用域:源文件中可以引用它们,但不能在该源文件中声明(分配),而是在另一个源文件中声明。
我们应该用“编译单元”代替“源文件”,因为编译单元指的是正在编译的C源文件以及所有包含的文件。作用域涉及编译单元中编译器可以“看到”的所有内容。这些是命名空间。
完成项目编译后会产生多个对象文件,每个文件对应一个编译单元。每个文件可能引用未在编译单元中声明的变量。此时链接器必须解决对象文件之间的这些引用:这就是链接。
这也适用于函数。

1
保持阅读您的页面(http://msdn.microsoft.com/en-us/library/teta4z44.aspx)。这是关于翻译单元(源文件)之间对象可见性的内容。首先讨论“内部链接”:定义为static的对象,仅限于翻译单元但在整个程序中可用。
接下来讨论“外部链接”:未声明static的同级对象。这些在翻译单元之间共享。
最后,“无链接”:例如函数内变量,未声明extern,仅在该范围内唯一。
如果您按照页面底部的链接进行跟进,所有内容都有解释。

0

分享我对这个问题的理解。

作用域是为了编译器的利益,而链接则是为了链接器的利益。

编译器使用标识符的作用域来确定在文件的给定位置是否可以引用该标识符。当编译器将源文件转换为目标代码时,它会注意到哪些名称具有外部链接,最终将这些名称存储在对象文件内部的表中。

因此,链接器可以访问具有外部链接的名称;带有内部链接无链接的名称对链接器不可见。

(上述文本摘自书籍《C程序设计:现代方法》,其中包含完全相同的问题)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接