在嵌套名称空间中访问全局变量

时间:2020-03-30 06:12:47

标签: c++ namespaces

我对C ++很陌生,在命名空间方面遇到了麻烦。

#include <iostream>

int x = 10;

namespace ns {
    int x = 5;

    namespace ns_nested {
        int z = x;  //z is assigned a value of 5??
    }
}


int main(){
    std::cout << ns::ns_nested::z;
}

这将打印5。最初,我认为这是因为我只是将x的值从5更改为10

但是,如果我将x的第一个声明更改为const int x = 10,它仍会打印5

所以,我的问题是双重的:

  1. 我虽然在全局范围内声明的变量是...很好...全局的,因为只有它的一个实例可供所有人使用。那么,为什么/如何能够再次声明具有相同名称的变量的实例?

  2. 如果我将z的值分配给全局声明的x的值,而不是外部命名空间中的值,我该怎么做?

1 个答案:

答案 0 :(得分:2)

1)我虽然在全局范围内声明的变量是...很好...全局的,因为只有它的一个实例可供所有人使用。那么,为什么/如何能够再次声明具有相同名称的变量的实例?

  namespace ns {
    int x = 5;

    namespace ns_nested {
        int z = x;  //z is assigned a value of 5??
    }
 }

这里x不是全局名称空间,它在名称空间ns下

2)如果我将z的值分配给全局声明的x的值,而不是外部命名空间中的x的值,我该怎么做?

看到这个你可能有个主意

#include <iostream>

const int x = 10;

namespace ns
{
    int x = 5;

    namespace ns_nested
    {
        int z1 = ::x;    //global namespace
        int z2 = ns::x;  //ns namespace
    }
}


int main()
{
    std::cout << ns::ns_nested::z1<<std::endl;
    std::cout << ns::ns_nested::z2<<std::endl;
}