以下声明性区域的定义:
在名为a的程序文本的某些部分中引入了每个名称 声明性区域,这是程序中最大的部分 该名称有效,即该名称可用作其名称 非限定名称,指代同一实体。
我们在下面的规范中有例子:
int j = 24;
int main() {
int i = j, j;
j = 42;
}
标识符j被声明为名称两次(并使用两次)。该 第一个j的声明性区域包括整个例子。该 第一个j的潜在范围在j和之后立即开始 延伸到程序的末尾,但其(实际)范围不包括 和之间的文字。第二个声明区域 j的声明(分号前面的j)包括所有 {和}之间的文本,但它的潜在范围排除了 宣言我j的第二个声明的范围是相同的 作为其潜在的范围。
目前还不清楚如何确定任意名称的声明区域。至少我无法将其纳入标准。
答案 0 :(得分:1)
在文件范围内声明的变量的潜在范围(即,不在命名空间,类或函数内)是从声明变量的点到文件结尾。在函数内声明的变量的潜在范围是从声明变量的点到声明变量的close括号内。
如果在某个内部范围声明了同名的新变量,则变量的实际范围可能小于潜在范围。这称为 shadowing 。
// The following introduces the file scope variable j.
// The potential scope for this variable is from here to the end of file.
int j = 42;
// The following introduces the file scope variable k.
int k = 0;
// Note the parameter 'j'. This shadows the file scope 'j'.
void foo (int j)
{
std::cout << j << '\n'; // Prints the value of the passed argument.
std::cout << k << '\n'; // Prints the value of the file scope k.
}
// The parameter j is out of scope. j once again refers to the file scope j.
void bar ()
{
std::cout << j << '\n'; // Prints the value of the file scope j.
std::cout << k << '\n'; // Prints the value of the file scope k.
// Declare k at function variable, shadowing the file scope k.
int k = 1;
std::cout << k << '\n'; // Prints the value of the function scope k.
// This new k in the following for loop shadows the function scope k.
for (int k = 0; k < j; ++k) {
std::cout << k << '\n'; // Prints the value of the loop scope k.
}
// Loop scope k is now out of scope. k now refers to the function scope k.
std::cout << k << '\n'; // Prints the function scope k.
}
// Function scope k is out of scope. k now refers to the file scope k.