如何访问嵌套在命名空间中的未命名命名空间变量?

时间:2017-08-25 18:34:30

标签: c++ namespaces c++14 unnamed-namespace

此问题已在链接中进行了讨论 unnamed namespace within named namespace但没有提供关于如何访问嵌套在命名空间下的未命名命名空间变量的完美答案,以防两个变量相同

考虑此代码

namespace apple {   
    namespace {
                 int a=10;
                 int b=10;
              }
   int a=20;
}


int main()
{
cout<<apple::b; //prints 10
cout<<apple::a; // prints 20
}

始终隐藏未命名的命名空间"variable a"。如何访问未命名的命名空间的"variable a"

在命名空间中声明未命名的命名空间是否合法?

2 个答案:

答案 0 :(得分:1)

  

未命名的命名空间"variable a"始终是隐藏的。如何访问未命名的命名空间的"variable a"

看起来你根本无法限定封闭命名空间之外的未命名命名空间。

嗯,这里有解决歧义的方法:

namespace apple {   
    namespace {
        int a=10;
    }

    int getPrivateA() {
        return a;
    }

    int a=20;
}

int main() {
    cout<<apple::getPrivateA() << endl;
    cout<<apple::a << endl;
}

请参阅Live Demo

虽然我知道并不能完全回答您的问题(除非将未命名的命名空间嵌套在另一个命名空间内是合法的)。 我必须更多地研究c++ standard specification章节3.4和7.3中的内容,以便给出明确的答案,说明为什么你不想做你想做的事。

答案 1 :(得分:0)

前几天我读了这篇文章并得到了“如何访问”变量“未命名的命名空间?”的答案。

我完全知道它不是完美的答案,但它是一种从未命名的命名空间访问“a”的方法。

#include <iostream>
#include <stdio.h>

namespace apple {
        namespace {
                     int a=257;
                     int b=10;
                  }
       int a=20;
    }

using namespace std;

int main() {

int* theForgottenA;

// pointer arithmetic would need to be more modified if the variable before 
// apple::b was of a different type, but since both are int then it works here to subtract 1
theForgottenA = &apple::b - 1; 

cout << *theForgottenA; //output is 257

}