【发布时间】:2014-05-13 11:37:23
【问题描述】:
关于声明性区域:
每个名称都在程序文本的某些部分引入,称为 声明区域,它是程序的最大部分,其中 该名称有效
关于范围:
通常,每个特定名称仅在某些可能的范围内有效 程序文本的不连续部分称为其范围。
它们之间有什么区别?
【问题讨论】:
关于声明性区域:
每个名称都在程序文本的某些部分引入,称为 声明区域,它是程序的最大部分,其中 该名称有效
关于范围:
通常,每个特定名称仅在某些可能的范围内有效 程序文本的不连续部分称为其范围。
它们之间有什么区别?
【问题讨论】:
声明性区域是可以在其中声明名称的地方。即它们可以在块、类主体或命名空间的主体中声明。
范围只是程序文本的一些 sn-p。如果你说“这个名字的范围”,这个短语是指程序文本中可以使用名字不限定形式找到这个名字的部分。
目前这两个术语在标准中处于缺陷形式,并且有一个long standing active issue 来修复这些缺陷。
【讨论】:
我不确定您是从哪里获得这些定义的。它们在我看来确实一样。但是我发现了这篇文章:
简而言之,范围回答了“我在哪里可以使用这个名称?”这个问题。和 声明空间回答了“这个名字在哪里是唯一的?”的问题
看看这个例子:
class C {
int x;
void M() {
int x;
}
}
x 的范围是C 的整个主体,而声明性区域是C 的整个主体,不包括M 的主体。来源:
【讨论】:
声明性区域和范围之间的区别就像房间和位置之间的区别。
声明性区域(房间)的存在与特定名称无关。您定义了一个类、一个函数体或一个命名空间——由此引入了一个声明性区域。然后,您可以在该声明性区域中声明名称(将东西放入房间);或者您可以让该区域没有任何名称(空房间)。
在范围(位置)中,我们只能与名称相关;它本身没有范围,范围始终是名称的属性(就像位置是事物的属性)。名称的潜在范围与引入该名称的声明区域一致。
【讨论】:
在您提供的定义中,我只是将它们视为同一枚硬币的两个面。 declaration area 是变量生命周期的开始,scope 定义结束。虽然通俗地说,scope 通常指的是变量的整个生命周期,从开始到结束。请参阅下面的示例。
void someFunction ()
{
int x = 5; // declaration of x
for (int i = 0; i < 10; ++i)
{
int a = 3; // declaration of a
std::cout << a << std::endl;
} // end of scope for a
} // end of scope for x
【讨论】: