阅读很多命名空间和范围的定义无法准确理解这两个术语之间的区别。
例如:
如果标识符指定同名的两个不同实体 空间,范围可能重叠。
这让我很困惑。有人可以澄清它尽可能简单,强调差异。
答案 0 :(得分:0)
你遗漏了该陈述的第二部分:
C2011标准的如果是这样,一个实体的范围(内部范围)将结束 严格地在另一个实体的范围之前(外部范围)。在内部范围内, identifier指定在内部作用域中声明的实体;在外部宣布的实体 范围在内部范围内隐藏(并且不可见)。
Online draft,§6.2.1,第4段。
示例:
void foo( void )
{
int x = 42;
printf( "x = %d\n", x ); // will print 42
do
{
double x = 3.14;
printf( "x = %f\n", x ); // will print 3.14
} while ( 0 );
printf( "x = %d\n", x ); // will print 42 again
}
您使用相同的标识符x
来引用同一名称空间 1 中的两个不同对象。外部x
的范围与内部x
的范围重叠。内部x
的范围严格地在外部x
的范围之前结束。
内部x
“阴影”或“隐藏”外部x
。
<小时/>
答案 1 :(得分:0)
因此,例如,结构标记永远不会与变量名称或任何结构成员的名称冲突:
struct foo {
int foo;
};
struct foo foo;
对于在其中指定的每个实体,使用相同的标识符foo
是允许和可用的,因为结构标记,结构成员和普通变量名都属于不同的名称空间。该语言通过语言语法消除标识符的使用来支持这一点。
对于标识符指定的每个不同实体,标识符仅在称为其范围的程序文本的区域内可见(即,可以使用)。由相同标识符指定的不同实体具有不同的范围,或者位于不同的名称空间中。
属于同一名称空间的标识符可能具有重叠范围(受其他要求限制)。你问题中的引文摘自第6.2.1节第4段;它可能会帮助您在上下文中阅读它。但是,请考虑
int bar;
void baz() {
int bar;
// ...
}
函数外部的bar
具有文件范围,在声明后立即开始并持续到封闭翻译单元的末尾。函数内部的一个指定一个单独的局部变量;它具有块范围,从其声明结束开始,到最内层封闭块的右括号结束。在该块中,标识符bar
指定局部变量,而不是文件范围的变量;那里不能直接访问文件范围bar
。