2012-02-23 120 views
1

这里的会员在测试代码访问具名命名空间的成员当外部命名空间具有相同名称

extern "C" {int printf(const char *, ...);} 
namespace PS 
{ 
    int x = 10; // A 
    // some more code 

    namespace {  
     int x = 20; // B 
    } 
    // more code 
} 

int main() 
{ 
    printf("%d", PS::x); // prints 10 
} 

有什么办法来访问内部(未命名)命名空间的xmain

我不想更改PS内的代码。道歉,如果代码看起来非常不切实际。

P.S:我倾向于经常使用名称x

+4

那么......只是避免这种情况呢? – 2012-02-23 12:00:46

+1

您是否允许编辑未命名的名称空间?我的意思是,你可以添加代码到未命名的命名空间吗? – Nawaz 2012-02-23 12:00:55

+0

@Nawaz:没有! – 2012-02-23 12:02:08

回答

5

否。指定名称空间的唯一方法是按名称,而内部名称空间没有名称。

假设你不能重命名任何一个变量,你可以重新打开内部命名空间,并添加一个不同名称的访问函数或引用:

namespace PS { 
    namespace { 
     int & inner_x = x; 
    } 
} 

printf("%d", PS::inner_x); 
+0

甜心,我不知道你可以重新打开相同的未命名的命名空间,我认为它们是独一无二的。 +1 – Xeo 2012-02-23 12:17:50

+0

是重新打开命名空间解决了问题! – 2012-02-23 12:23:44

+2

@Xeo:它们在翻译单元中是唯一的。 – 2012-02-23 12:23:58

0

一种方法是添加以下代码:

namespace PS 
{ 
    namespace 
    { 
     namespace access 
     { 
      int &xref = x; 
     } 
    } 
} 

然后你就可以访问你想要什么:

std::cout << PS::access::xref << std::endl; //prints 20! 

演示:http://ideone.com/peqEs