全局范围vs全局命名空间 [英] Global scope vs global namespace

查看:165
本文介绍了全局范围vs全局命名空间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I saw usages of these two phrases: global scope and global namespace. What is the difference between them?

推荐答案

在C ++中,每个名称都有其范围之外,它不存在。范围可以通过多种方式定义:它可以通过命名空间函数 {}

In C++, every name has its scope outside which it doesn't exist. A scope can be defined by many ways : it can be defined by namespace, functions, classes and just { }.

因此,命名空间(全局或其他)定义范围。全局命名空间引用使用 :: ,并且在此命名空间中定义的符号称为具有全局范围。默认情况下,符号存在于全局命名空间中,除非它在块中定义,以关键字 namespace 开头,或者是类的成员或局部变量的函数:

So a namespace, global or otherwise, defines a scope. The global namespace refers to using ::, and the symbols defined in this namespace are said to have global scope. A symbol, by default, exists in a global namespace, unless it is defined inside a block starts with keyword namespace, or it is a member of a class, or a local variable of a function:

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.
};

另请注意,名称命名空间,函数或类。所以命名空间 N 中的名称 a 隐藏了 a 在全局namspace中。同样,函数和类中的名称隐藏了全局命名空间中的名称。如果你遇到这种情况,那么你可以使用 :: a 来引用全局命名空间中定义的名称:

Also note that a name can be hidden by inner scope defined by either namespace, function, or class. So the name a inside namespace N hides the name a in the global namspace. In the same way, the name in the function and class hides the name in the global namespace. If you face such situation, then you can use ::a to refer to the name defined in the global namespace:

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
    }
}

这篇关于全局范围vs全局命名空间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆