【问题标题】:What information does variable "scope type" provide that is not already described by variable "linkage type"?变量“范围类型”提供了哪些变量“链接类型”尚未描述的信息?
【发布时间】:2021-01-01 16:09:57
【问题描述】:

在“C 编程:一种现代方法”一书中,第 18 章介绍了声明的一些技术性更强的特性。在第 459 页,作者指出 C 程序中的变量具有三个属性:

  1. 存储持续时间 -(自动 vs 静态
  2. 范围 - (block vs file)
  3. 联动 - (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 种情况,您会看到 没有链接的块范围对具有内部或外部链接的文件范围对

因此,我看不到通过指定范围添加的信息。也就是说:

  1. 如果我知道一个变量具有 no links 的特性,那么我就知道作用域类型必须是 block
  2. 如果我知道一个变量具有内部链接外部链接的特性,那么我知道范围类型必须是文件

我不熟悉将块作用域内部链接结合使用的代码。我不熟悉将块范围外部链接结合使用的代码。最后,我不熟悉使用 file scopeno links 的代码。

看来链接类型提供了所需的所有相关信息...那么范围的重点是什么?

谢谢!

编辑:

换句话说,这些术语不是独立的(有些组合根本不存在,至少看起来是这样)。

这是一张我认为正确地表达了这个想法的图片:

【问题讨论】:

  • @user10191234 这实际上是我在问这个问题之前经历的帖子之一。我没有得到我希望的答案。特别提到我的问题,您能否提供一个具有“没有链接的文件范围”或“具有内部/外部链接的块范围”的代码示例?如果没有,那么我的问题仍然存在。
  • 我只看到一个明确的问题。 范围的意义是什么?在某种程度上,scope 意味着可见性范围和生命周期,并且通过了解这个概念,它允许划分,这反过来可以提供有限的或投影的全局可见性和内存保护。 (即自动装置的有限寿命等)。静态链接仍然提供有限的可见性,同时还将生命周期延长到执行结束,提供它自己的一系列好处。
  • @ryyker 我的问题的重点(最重要的“明确”问题是标题中嵌入的问题)在我看来,范围似乎是链接类型的属性而不是属性一个变量......所以这个概念通常被教授的方式对我来说似乎有点错误。当然...链接类型是变量的属性,因此您可以将作用域视为该变量的属性类型...但它是变量的更“远端”属性。
  • 无论您是否认为它是变量的外部(比说远端更简单),变量范围都是一个重要的属性。它的整个生命周期都伴随着这个变量。

标签: c variables scope variable-declaration linkage


【解决方案1】:

虽然作用域和链接之间存在关系,但它们代表两个独立的概念。

此外,C 标准为标识符定义了四种不同的范围:

  • 文件
  • 阻止
  • 功能
  • 函数原型

这是在C standard 的第 6.2.1p2 节中指定的:

对于标识符指定的每个不同实体, 标识符可见(即可以使用)仅在 程序文本称为其范围。不同的实体指定 dby 相同的标识符要么具有不同的范围,要么具有不同的名称 空格。作用域有四种:function、file、block、 和函数原型。 (函数原型是一个声明 声明其参数类型的函数。)

唯一具有功能范围的标识符是标签。标签可以在函数中的任何位置被引用,只要它被声明。

带有函数原型的标识符是出现在函数声明中的函数参数。例如:

void foo(int x);   //  x has function prototype scope

对于具有函数作用域或函数原型作用域的标识符,它们不代表一个对象。那么在这些情况下,标识符没有链接。第 6.2.2p6 节指出:

以下标识符没有链接:声明为 不是对象或函数;标识符 声明为函数参数;块范围标识符 对于声明没有存储类说明符extern的对象@

所以要回答您的问题,标识符的链接并不意味着它的范围。没有链接的标识符可以有块作用域、函数作用域或函数原型作用域。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2019-05-01
    • 2014-05-04
    • 2022-11-15
    • 2017-12-26
    相关资源
    最近更新 更多