2016-01-09 89 views
0

例如,我們有這樣的計劃:如何使用名稱空間的行爲完全相同?

#include <iostream> 

namespace a 
{ 
    namespace b 
    { 
     namespace c 
     { 
      int alpha = 5; 
     } 
    } 
} 

int main() 
{ 
    using namespace a; 
    using namespace b; 
    using namespace c; 
    std::cout << alpha; 
    return 0; 
} 

編譯成功後,我認爲使用命名空間的行爲像UNIX cd。在我們代碼的第一行中,我們在根::,然後我們移動到::a,::a::b,::a::b::c。但經過這樣的修改和成功運行,我被驚呆了:

int main() 
{ 
    using namespace a; 
    using namespace b; 
    using namespace c; 
    using namespace b; 
    std::cout << alpha; 
    return 0; 
} 

它仍然有效,我們都不是「在b目錄」!

即使是這樣的結構允許...:

namespace a 
{ 
    namespace b 
    { 
     namespace c 
     { 
      int alpha = 5; 
     } 

    } 
} 

namespace b 
{ 
    namespace a 
    { 
    } 
} 


void main() 
{ 
    using namespace a; 
} 

解釋,請使用命名空間的行爲!

+2

命名空間與目錄無關。如果你想要一個類似shell的隱喻,那麼別名可能更接近事實。當使用namespace a時,符號'b'成爲':: a :: b'的別名。 –

回答

2

書寫using namespace x;只是將x中的所有名稱帶入當前範圍。 x中的名稱可能包含其他名稱空間的名稱。

把你的第一個例子:

#include <iostream> 

namespace a 
{ 
    namespace b 
    { 
     namespace c 
     { 
      int alpha = 5; 
     } 
    } 
} 

int main() 
{ 
    using namespace a; 
    using namespace b; 
    using namespace c; 
    std::cout << alpha; 
    return 0; 
} 

首先,using namespace a;使得可用的內部main名稱b。這允許我們然後做using namespace b;,其另外使名稱cmain中可用。最後,我們可以使用using namespace c;來提供名稱alpha。現在你的第二個例子

int main() 
{ 
    using namespace a; 
    using namespace b; 
    using namespace c; 
    using namespace b; 
    std::cout << alpha; 
    return 0; 
} 

前三行是像以前一樣,把名字bc,並alpha到範圍。最後,重複using namespace b;不起作用,因爲我們已經將b的所有名稱都納入了範圍。此外,alpha已被納入範圍,所以仍然可以在下一行中找到。最後的using namespace b;並不能解決這個問題。

1

使用名稱空間有效展開其內容。 這就是爲什麼「使用命名空間標準;」允許你使用不帶std ::前綴的「cout」。不要更改目錄,而是將名稱空間的內容移動到當前目錄中。

相關問題