2016-09-16 60 views
3

我有以下代码,我不知道如何访问此设置中的匿名命名空间内的x。请告诉我如何?访问匿名命名空间中的变量(C++)

#include <iostream> 

int x = 10; 

namespace 
{ 
    int x = 20; 
} 

int main(int x, char* y[]) 
{ 
    { 
     int x = 30; // most recently defined 
     std::cout << x << std::endl; // 30, local 
     std::cout << ::x << std::endl; // 10, global 
     // how can I access the x inside the anonymous namespace? 
    } 

    return 0; 
} 
+4

你不能。不要这样做。 –

+0

非常感谢... !!! –

+0

一些相关的阅读:http://stackoverflow.com/questions/9622874/unnamed-namespace-access-rules – NathanOliver

回答

1

You can't!

无法通过其名称访问命名空间的成员,因为它没有一个。
它是匿名的。

您只能通过他们已被拉入范围访问这些成员。

+0

谢谢,那么为什么人们在命名空间内创建了这样一个无法访问的变量?由于他们已经被纳入范围而获得了什么意思?你能告诉我更具体吗? :) –

+0

@DongkyuChoi:这意味着该对象不能在该翻译单元之外被直接引用。它在某种意义上使对象成为“文件本地”。它已被拉入该“文件”的范围,因此您可以在那里使用它(如您在问题中所示),但无处可用。 –

0

你必须从匿名同一范围内的功能访问:

#include <iostream> 

int x = 10; 

namespace 
{ 
    int x = 20; 
    int X() { return x; } 
} 

int main(int x, char* y[]) 
{ 
    { 
     int x = 30; // most recently defined 
     std::cout << x << std::endl; // 30, local 
     std::cout << ::x << std::endl; // 10, global 
     std::cout << X() << std::endl; // 20, anonymous 
     // how can I access the x inside the anonymous namespace? 
    } 

    return 0; 
} 
+0

哇,我明白了!非常感谢您的回答!! –

+0

不,不,不!因为X()是唯一的,所以如果你添加一个外部函数X(),那么这个将隐藏你的内部X()。 – Raindrop7

+1

能够访问匿名命名空间内的数据考虑:永远不要使用相同的名称声明任何外部数据。 – Raindrop7