命令空间范围在c confusion中

时间:2017-02-13 16:12:25

标签: c scope

阅读很多命名空间和范围的定义无法准确理解这两个术语之间的区别。

例如:

  

如果标识符指定同名的两个不同实体   空间,范围可能重叠。

这让我很困惑。有人可以澄清它尽可能简单,强调差异。

2 个答案:

答案 0 :(得分:0)

你遗漏了该陈述的第二部分:

  

如果是这样,一个实体的范围(内部范围)将结束   严格地在另一个实体的范围之前(外部范围)。在内部范围内,   identifier指定在内部作用域中声明的实体;在外部宣布的实体   范围在内部范围内隐藏(并且不可见)。

C2011标准的

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. C定义了四个名称空间 - 标签名称(由`goto`关键字和`:`消除歧义),struct / union / enum标签名称(由`struct`,`union`和`enum`关键字消除歧义), struct和union成员名称(由`.`和` - &gt;`运算符消除歧义),以及其他所有内容(变量名,函数名,typedef名称枚举常量等)。

答案 1 :(得分:0)

C中的“命名空间”与命名的事物的有关。 Section 6.2.3 of the standard区分了四种命名空间

  • 一个用于标签
  • 每个用于结构,联合和枚举的标签
  • 每个结构或联盟的成员
  • 一个用于所有其他标识符

因此,例如,结构标记永远不会与变量名称或任何结构成员的名称冲突:

struct foo {
    int foo;
};
struct foo foo;

对于在其中指定的每个实体,使用相同的标识符foo是允许和可用的,因为结构标记,结构成员和普通变量名都属于不同的名称空间。该语言通过语言语法消除标识符的使用来支持这一点。

另一方面,“范围”与 where 有关 - 就程序源而言 - 给定的标识符是可用的,以及它在那时指定的实体。正如标准的section 6.2.1所说:

  

对于标识符指定的每个不同实体,标识符仅在称为其范围的程序文本的区域内可见(即,可以使用)。由相同标识符指定的不同实体具有不同的范围,或者位于不同的名称空间中。

属于同一名称空间的标识符可能具有重叠范围(受其他要求限制)。你问题中的引文摘自第6.2.1节第4段;它可能会帮助您在上下文中阅读它。但是,请考虑

int bar;
void baz() {
    int bar;
    // ...
}

函数外部的bar具有文件范围,在声明后立即开始并持续到封闭翻译单元的末尾。函数内部的一个指定一个单独的局部变量;它具有块范围,从其声明结束开始,到最内层封闭块的右括号结束。在该块中,标识符bar指定局部变量,而不是文件范围的变量;那里不能直接访问文件范围bar