【问题标题】:Accessing a global variables within nested namespaces访问嵌套命名空间中的全局变量
【发布时间】:2020-07-10 11:49:40
【问题描述】:

我对 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 的值从 10 更改为 5

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

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

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

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

【问题讨论】:

  • int z = x; x 中正在搜索命名空间层次结构:首先是::ns::ns_nested::x,然后是::ns::x,然后是::x::ns::x::x 不一样。
  • 使用命名空间的原因之一是不同的事物可以具有相同的名称。我可以创建自己的 sort 函数,它不会与标准排序冲突,因为它们的名称为 std::sortmy::sort。这里有::xns::x
  • @Mubin - 那么,为什么/我能够再次声明具有相同名称的变量的实例? - 你想知道int x = 10; void fn() { int x = 5; } 的相同吗?
  • 这能回答你的问题吗? Nested NameSpaces in C++
  • @Armali 是的,实际上。

标签: c++ namespaces


【解决方案1】:

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

  namespace ns {
    int x = 5;

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

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

2)如果我要将 z 的值分配给全局声明的 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;
}

【讨论】:

    猜你喜欢
    • 2021-04-19
    • 2011-08-31
    • 2018-02-03
    • 2012-03-13
    • 2021-12-28
    • 2012-05-11
    • 2011-03-25
    • 1970-01-01
    • 2012-05-15
    相关资源
    最近更新 更多