【发布时间】:2021-01-01 16:09:57
【问题描述】:
在“C 编程:一种现代方法”一书中,第 18 章介绍了声明的一些技术性更强的特性。在第 459 页,作者指出 C 程序中的变量具有三个属性:
- 存储持续时间 -(自动 vs 静态)
- 范围 - (block vs file)
- 联动 - (external vs internal vs none)
我浏览了几个不同的网站和几个不同的 S.O.帖子,但我仍然难以理解 范围 和 linkages 之间的区别。
我遇到的主要概念难题之一是确定唯一信息,该信息通过指定变量的范围提供链接类型尚未给出强>。似乎有一些我完全遗漏的细微差别。
考虑以下变量声明示例:
案例一:
void foo(void)
{
static int j; /* block scope + no linkage */
}
案例 2:
int i; /* file scope + external linkage */
int main(void)
{
.
.
.
}
案例 3:
static int i; /* file scope + internal linkage */
int main(void)
{
.
.
.
}
如果您查看这 3 种情况,您会看到 没有链接的块范围对和 具有内部或外部链接的文件范围对。
因此,我看不到通过指定范围添加的信息。也就是说:
- 如果我知道一个变量具有 no links 的特性,那么我就知道作用域类型必须是 block
- 如果我知道一个变量具有内部链接或外部链接的特性,那么我知道范围类型必须是文件。
我不熟悉将块作用域与内部链接结合使用的代码。我不熟悉将块范围与外部链接结合使用的代码。最后,我不熟悉使用 file scope 而 no links 的代码。
看来链接类型提供了所需的所有相关信息...那么范围的重点是什么?
谢谢!
编辑:
换句话说,这些术语不是独立的(有些组合根本不存在,至少看起来是这样)。
这是一张我认为正确地表达了这个想法的图片:
【问题讨论】:
-
@user10191234 这实际上是我在问这个问题之前经历的帖子之一。我没有得到我希望的答案。特别提到我的问题,您能否提供一个具有“没有链接的文件范围”或“具有内部/外部链接的块范围”的代码示例?如果没有,那么我的问题仍然存在。
-
我只看到一个明确的问题。 范围的意义是什么?在某种程度上,scope 意味着可见性范围和生命周期,并且通过了解这个概念,它允许划分,这反过来可以提供有限的或投影的全局可见性和内存保护。 (即自动装置的有限寿命等)。静态链接仍然提供有限的可见性,同时还将生命周期延长到执行结束,提供它自己的一系列好处。
-
@ryyker 我的问题的重点(最重要的“明确”问题是标题中嵌入的问题)在我看来,范围似乎是链接类型的属性而不是属性一个变量......所以这个概念通常被教授的方式对我来说似乎有点错误。当然...链接类型是变量的属性,因此您可以将作用域视为该变量的属性类型...但它是变量的更“远端”属性。
-
无论您是否认为它是变量的外部(比说远端更简单),变量范围都是一个重要的属性。它的整个生命周期都伴随着这个变量。
标签: c variables scope variable-declaration linkage