【问题标题】:C scope overlappingC范围重叠
【发布时间】:2018-05-02 11:18:30
【问题描述】:

C 标准状态(强调我的):

如果一个标识符在同一个名称空间中指定了两个不同的实体,则范围可能重叠。 [...]

(来自http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 的第 6.2.1.4 节)

标识符何时可以引用两个不同的实体,但它们的范围不重叠?

或者,换个说法,为什么引文中有“可能”这个词?

【问题讨论】:

  • 答案就在你引用的那句话之后......
  • @HuStmpHrrr 我认为OP的问题是,为什么它不说“范围重叠”? “可能”一词意味着范围也可能重叠,问题是如何会发生这种情况。
  • @bnaecker 是的,这正是我要问的。
  • { { int i; } { int i; } } 在同一命名空间(标识符)中阻止作用域,但不重叠。
  • @Jean-BaptisteYunès 但是标识符如何指定两个不同的实体?

标签: c scope language-lawyer


【解决方案1】:

name 的这些范围重叠:

int f(void) {
  int name = 4;
  {
     int name = 6;
  }
}

这些不重叠:

int f(void) {
  {
     int name = 4;
  }
  {
     int name = 6;
  }
}

【讨论】:

  • 是的,这就是我现在对这句话的理解。最初我认为“如果一个标识符在同一个名称空间中指定两个不同的实体 [...]”意味着 在程序中的某个点一个标识符“指定”两个不同的实体,因此我没有看到他们的范围在那种情况下不能重叠。
  • @user42768 在程序中的任何一点,由于范围规则,给定名称最多指定给定名称空间中的一个实体。在应用范围之前,不能对名称在特定点指定的内容提出任何声明。引用是指可能的名称,而不考虑范围。
  • 作用域不一样。
【解决方案2】:

将其理解为“如果标识符在同一名称空间中指定两个不同的实体,则范围可能会重叠。”也就是说,这句话是在说范围可能重叠,它是在解释发生这种情况的条件。不幸的是,英语不精确。这句话并不是要表达这样的逻辑陈述:如果一个标识符指定了同一名称空间中的两个实体,则存在它们重叠的程序和不存在重叠的程序。它表达了作用域可能重叠的事实,以及当标识符指定同一名称空间中的两个不同实体时会发生这种情况的事实。

【讨论】:

  • 解释要么是这样(但我认为如果我们这样解释,引用的含义会发生重大变化)或@Jean-BaptisteYunès 的评论。该标准可能会考虑,如果有两个同名的实体(无论它们的位置如何),它们的共享标识符“指定”它们。
  • 这就是答案。
  • @Jean-BaptisteYunès 那么 Eric Postpischil 的答案是正确的还是你的?鉴于我在评论中提到的另一条引述(来自 6.2.1.2),我倾向于相信它是你的。
  • 就在你身边!因为我的评论是你可以评分的;-)
  • @EricPostpischil 正如我在上面的评论中所说,我注意到了这种歧义。但是,我仍然相信:“如果标识符在同一个名称空间中指定两个不同的实体,则范围可能会重叠。[...]”,使用“指定”的“全局”意义。因此,如果有两个同名的实体,它们的范围可能重叠也可能不重叠。但如果它们确实重叠,则该段的其余部分规定范围必须嵌套。
【解决方案3】:

我认为这个词可能指的是一般情况的可能性,而不是发生的可能性(这意味着允许发生,当它发生时会有重叠)。 以下几行通过告诉在这种情况下发生的情况来说明这一点(内部范围将是外部范围的严格子范围,在此范围内,我们将使用在此内部范围内定义的完整性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多