2013-05-27 80 views
3

當我運行下面的代碼片段時,輸出是a是6。但是因爲我已經使用名稱空間n1,它也具有名稱「a」的變量,所以不應該輸出爲a是5。我錯過了什麼嗎?瞭解C++中的命名空間範圍

#include <iostream> 

using namespace std; 

namespace n1{ 
    int a = 5; 
} 

int main(void){ 
    int a = 6; 
    using namespace n1; 
    cout<<"a is "<<a<<endl; 
    return 0; 
} 

但是,如果我在使用全名COUT即COUT < < 「一個是」 < < N1 ::一個;輸出如預期的那樣。5.使用命名空間的的目的是什麼?

+0

你的'了'是主要地方。你必須使用'n1 :: a'。 – user1810087

回答

2

規則很簡單:
「局部變量總是陰影/隱藏在其他命名空間或具有相同名稱的全局變量的變量。」

在其中局部變量a聲明的範圍內,使用指令有w.r.t符號名a沒有影響。它仍然會從當前範圍內的名稱空間n1導入所有符號名稱,但本地變量a仍然隱藏n1::a。所以n1::a是不可見的,你需要使用它的完全限定名稱。

+0

但是,如果我全局定義變量a而不是本地(但仍保留名稱空間定義),編譯器會將'a'報告爲模糊符號。那麼名稱空間或全局定義的變量是不是相互優先? – niting112

+0

@ niting112:只有局部變量在這方面被視爲特殊的。正如你在命名空間變量和全局的情況下注意到的那樣,既沒有給予特殊處理,也沒有給出模糊性錯誤。 –

2

using指令是向編譯器提示的位置,它應該搜索名稱a

這樣,名稱查詢將在此順序進行:

    在局部範圍內進行 a
  • 首先搜索
  • 如果a沒有找到,在命名空間中搜索n1
  • 如果還是沒有發現a,看在全局命名空間

沒有using d你提供的指令,第二步不會被執行。

在你的情況下,因爲實際上有一個變量(但它可能是任何東西,我們正在談論的名稱)名爲a,它不會再進一步​​。

+0

但如果被定義爲全局,而不是局部和也是在命名空間中定義,編譯器將其標記錯誤說「一個不明確」。但根據上述規則,不應該變量的命名空間應該採取precendence上述全球範圍的「 – niting112

+0

定義呃?當我嘗試一個很簡單的例子,我沒有這樣的消息......(聲明和定義了''作爲全球在一個命名空間,並在主範圍內)。 – JBL

+0

可能這是編譯器相關的。我使用Visual Studio 2010中您測試哪一個呢? – niting112

1

當在本地命名空間中定義一個變量(一個在main中的是在你的本地命名空間中)時,它會更喜歡它。

因此,在這種情況下,你必須告訴它(我想了一個從N1命名空間N1 ::一) 如果刪除了一個預期它會工作...