全球范围VS全局命名空间全球范围VS全局命名空间(Global scope vs global na

2019-05-13 14:15发布

我看到这两个词组的用法:全球范围内和全局命名空间。 它们之间有什么区别?

Answer 1:

在C ++中,每一个名字都有它的范围之外,它不存在。 作用域可以通过多种方式来定义:它可以通过命名空间函数 ,只是{}来定义。

因此,一个命名空间,全球或以其他方式,定义了一个范围。 全局命名空间是指使用:: ,并在此命名空间中定义的符号被认为具有全局范围。 符号,默认情况下,存在于一个全局命名空间,除非它被定义内的块与关键字开始namespace ,或者它是一个类的成员,或函数的一个局部变量:

int a; //this a is defined in global namespace
       //which means, its scope is global. It exists everywhere.

namespace N
{
     int a;  //it is defined in a non-global namespace called `N`
             //outside N it doesn't exist.
}
void f()
{
   int a;  //its scope is the function itself.
           //outside the function, a doesn't exist.
   {
        int a; //the curly braces defines this a's scope!
   }
}
class A
{
   int a;  //its scope is the class itself.
           //outside A, it doesn't exist.
};

另外请注意,一个名字可以通过任一的命名空间,函数或类中定义范围内被隐藏。 所以这个名字a内部命名空间N隐藏名称a全球namspace。 以同样的方式,在函数和类的名称隐藏在全局命名空间的名称。 如果你遇到这样的情况,那么你可以使用::a指在全局命名空间中定义的名称:

int a = 10;

namespace N
{
    int a = 100;

    void f()
    {
         int a = 1000;
         std::cout << a << std::endl;      //prints 1000
         std::cout << N::a << std::endl;   //prints 100 
         std::cout << ::a << std::endl;    //prints 10
    }
}


Answer 2:

“范围”是不是“命名”更总称。 每命名空间,类和码块定义一个范围,其中声明的名称在它里面都可以使用; 命名空间是外面类和函数声明的名称的容器。

“全球范围”和“全局命名空间”可以或多或少地互换使用; 在一个命名空间中声明的名称的范围覆盖该命名空间。 如果你指的是其内部名称的知名度使用“命名空间”,如果你具体指的命名空间,和“范围”。



Answer 3:

适用范围表示对象的生命周期,你可以有你的程序执行,这将是长期存在的一个全局变量,或者你可以有一个块作用域的变量,只要代码块执行会存在。 考虑下面这个例子:

#include <iostream>

int a = 100;

main () {
    int a = 200;

    std::cout << "local a is: " << a << std::endl;
    std::cout << "global a is: " << ::a << std::endl;

    return 0;
}

当执行该语句将打印local a is: 200 ,这显然是预期的,因为我们正在重新定义amain留下的范围,它的封闭块。 我们还打印了全球::a再次打印预期值100,因为我们所要求的全局命名空间::

命名空间的语义大多是合乎逻辑的,它是从彼此隔离symblos,希望避免名称冲突的一种方式,它不会影响对象的生命周期。

在另一方面范围,表示对象,全球的寿命a弹簧进入存在本地前a ,因为它被建造比主被执行的要早得多。 然而,范围也将强制符号命名空间,但不能以同样的方式,一个namespace一样。 有不同种类范围的globalclassfunctionblockfile等...

混乱的部分是,范围有时重载表示特定符号,而这是从C,其中的命名空间的概念不存在和范围的借用被用来表示这两个,寿命和可视性的可见性。 在C ++,但是规则改了一下,但这个词范围仍然采用同样的方式,因为这两种语言共享的概念很大。



Answer 4:

当你声明一个全局变量int i例如,我们说i is in the global namespace ,并has the global namespace scope 。 就这样。

摘自C ++ 03:

3.3.5 Namespace scope   

    The outermost declarative region of a translation unit is also a namespace, called
  the global namespace. A name declared in the global namespace has global namespace
  scope (also called global scope).


Answer 5:

@Dmitriy Ryajov

主题是有点老了,但我想我提供这个帮助。 我认为你不应该让事情变得更复杂得多,他们真的是。 Scope的标识符是该标识,即是指在程序某些实体的名称,可被用来寻找被称为实体的计算机程序的一部分。 所以说,范围只适用于标识符,我们不应该与对象的生命周期混合它。 他们有些连接,但不应该混淆。 对象的生存期由我们分配该对象的存储器表示。 因此,举例来说,如果一个内存在栈上分配的,将尽快完成功能中解脱出来。 所以,这取决于我们存储的对象和表示其寿命。 范围只是说:“这是一个对象的名称,我们可以为对象使用这个名字,直到然后再”。 所以,正如我所说的,术语scope只是针对对象的标识符,寿命是别的东西至极由我们存储的对象表示。

此外,我想谈谈linkage这是密切与此有关。 这可有时也令人困惑。 比方说,我们在一些标识符translation unit引用某些对象。 无论是在相同的标识符other翻译单元将指向同一个实体是由联动表示。 因此,例如,如果一个标识符具有外部连接,我们可以参考该实体,该标识符是指但来自其他翻译单元通过用关键字声明它extern 。 现在,让我们说,我们不希望使用该实体在其他翻译单元。 然后,该实体将exist ,直到程序结束,但是,当我们不申报的话,我们将无法参考。 还要注意的是,现在我是混合性条款联动和寿命。 但是,这是因为只有global实体具有外部链接。 在函数内部的标识符不能从程序的其它部分refered到。

结论:总是试图让事情变得简单。 我很惊讶人们如何不同谈谈这方面有所不同。 独立编译的整个过程是混乱的,因为存在具有几乎相同的含义,可能每个人都会遇到困难,在这一点上的多个方面。



文章来源: Global scope vs global namespace