2012-02-23 238 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

相關問題