我试过不同的网站,但我不明白。你能用简单的英语解释一下吗?
dluptydi1#
“scope”是编译器的命名空间;“链接”是关于编译单元的。我再解释一下:在函数中声明的变量具有该函数的作用域,即它只在该函数中可见。在源文件中声明为静态的变量,只有该源文件中的代码(以及所有包含的文件!)才能看到。变量也可以具有全局作用域:它们可以在源文件中被引用,但不是在该源文件中被声明(分配),而是在另一个源文件中被声明。我们应该说“编译单元”而不是“源文件”,因为它是正在编译的C源文件,加上所有包含的文件。作用域是指编译器在编译单元中“看到”的所有内容。这些是命名空间。编译项目后,会有许多目标文件,每个编译单元对应一个目标文件。每个目标文件都可能引用未在编译单元中声明的变量。链接器现在必须解析目标文件之间的这些引用:链接。这也适用于函数。
8qgya5xd2#
继续阅读你的页面(http://msdn.microsoft.com/en-us/library/teta4z44.aspx)。这是关于翻译单元(源文件)之间对象的可见性。它首先讨论“内部链接”:定义为static的对象,对于翻译单元是唯一的,但在整个翻译单元中可用。接下来就谈到“外部联动”:未声明为static的类似级别对象。这些对象在翻译单元之间共享。最后,“不联动”:一个对象,例如函数中的变量,未声明为extern,它对于该作用域是唯一的。如果你点击页面底部的链接,就可以了解到所有的信息。
static
extern
eimct9ow3#
分享我对这个问题的了解。Scope是为了compiler的利益,而linkage是为了linker的利益。compiler使用标识符的scope来确定在文件中的给定位置引用该标识符是否法律的。当编译器将源文件转换为目标代码时,它会记录哪些名称具有external linkage,最终将这些名称存储在目标文件中的表中。因此,linker可以访问具有external linkage的名称;带有internal linkage或no linkage名称对链接器不可见(The以上文字摘自《C语言编程:一种现代的方法”,其中包含了一个完全相同的问题)。
Scope
compiler
linkage
linker
scope
external linkage
internal linkage
no linkage
3条答案
按热度按时间dluptydi1#
“scope”是编译器的命名空间;“链接”是关于编译单元的。
我再解释一下:在函数中声明的变量具有该函数的作用域,即它只在该函数中可见。在源文件中声明为静态的变量,只有该源文件中的代码(以及所有包含的文件!)才能看到。变量也可以具有全局作用域:它们可以在源文件中被引用,但不是在该源文件中被声明(分配),而是在另一个源文件中被声明。
我们应该说“编译单元”而不是“源文件”,因为它是正在编译的C源文件,加上所有包含的文件。作用域是指编译器在编译单元中“看到”的所有内容。这些是命名空间。
编译项目后,会有许多目标文件,每个编译单元对应一个目标文件。每个目标文件都可能引用未在编译单元中声明的变量。链接器现在必须解析目标文件之间的这些引用:链接。
这也适用于函数。
8qgya5xd2#
继续阅读你的页面(http://msdn.microsoft.com/en-us/library/teta4z44.aspx)。这是关于翻译单元(源文件)之间对象的可见性。它首先讨论“内部链接”:定义为
static
的对象,对于翻译单元是唯一的,但在整个翻译单元中可用。接下来就谈到“外部联动”:未声明为
static
的类似级别对象。这些对象在翻译单元之间共享。最后,“不联动”:一个对象,例如函数中的变量,未声明为
extern
,它对于该作用域是唯一的。如果你点击页面底部的链接,就可以了解到所有的信息。
eimct9ow3#
分享我对这个问题的了解。
Scope
是为了compiler
的利益,而linkage
是为了linker
的利益。compiler
使用标识符的scope
来确定在文件中的给定位置引用该标识符是否法律的。当编译器将源文件转换为目标代码时,它会记录哪些名称具有external linkage
,最终将这些名称存储在目标文件中的表中。因此,
linker
可以访问具有external linkage
的名称;带有internal linkage
或no linkage
名称对链接器不可见(The以上文字摘自《C语言编程:一种现代的方法”,其中包含了一个完全相同的问题)。