2014-10-27 113 views
1

我尝试过不同的网站,但我不明白。你能用简单的英语解释吗?范围和连接有什么区别?

+2

来自C标准(或更确切地说,某些C99草案N1570),6.2.2/1的一个令人惊讶的简单陈述“在不同范围内或在同一范围内声明的标识符不止一次可用于引用同一对象或通过称为链接的过程运行。“ – dyp 2014-10-27 01:53:22

+2

@dyp:[N1570](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)是C11的草稿,而不是C99的草稿。 – 2014-10-27 03:20:55

+0

@dyp嗯,我发现这里http://msdn.microsoft.com/en-us/library/teta4z44.aspx,然后它说:“联系确定程序中可以引用标识符的部分(其”可见性“)。”所以它将可见性(我所理解的是范围)与链接混合在一起。我是一个begginer,它很混乱。 – user3646717 2014-10-27 03:50:19

回答

0

继续阅读您的网页(http://msdn.microsoft.com/en-us/library/teta4z44.aspx)。这是谈论翻译单位(源文件)之间对象的可见性。它首先讨论“内部链接”:定义为static的对象,对于翻译单元是唯一的,但始终可用。

接下来讨论“外部连接”:类似对象没有声明为static。这些由翻译单位共享。

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

如果您按照页面底部的链接进行了解释。

1

“scope”是编译器的名称空间; “联动”是关于编制单位的。

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

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

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

这也适用于功能。

相关问题