2015-10-06 138 views
3

我知道我使用指令的範圍僅限於一個塊或一個函數。那麼它將僅適用於該範圍。但是,如果該塊是namespace它通過相同的命名空間的所有塊顯式應用。那是對的嗎?至少,下面的例子說明:(http://ideone.com/K8dk7E在另一個命名空間中使用命名空間的範圍

namespace N1 
{ 
    struct Foo{}; 
} 

namespace N2 
{ 
    using namespace N1; 
    Foo f; 
} 

namespace N2 
{ 
    Foo f2; 
} 

int main() 
{ 
    N2::f2; 
} 

我曾預計Foo f2給一個錯誤,因爲Foo應該是未知的。 所以我真正的問題是,在命名空間塊中的using語句對同一命名空間的所有塊有效嗎?

當所有cpp文件都包含在一起並編譯在一起時,會造成問題,因爲它會污染其他cpp文件,而這些文件不應包含其他命名空間(使用using指令的那個命名空間)。所以,實際上它可能會導致不希望的衝突。

+0

您是否問N1成員是否會在N2的擴展名稱空間定義中可見? – SingerOfTheFall

+0

我覺得你提供的例子並沒有很好地說明你的問題。通過SUC,後期編寫的代碼就很好。 – StoryTeller

+0

您確定這不僅僅是包含單個文件的順序問題嗎? – StoryTeller

回答

5

的標準說(7.3.4/2)

甲 ù sing-directive 指定可以在 使用指令 出現在 使用指令 之後的範圍內使用指定名稱空間中的名稱。

namespace A { \ 
int i = 9;  | <-- namespace A scope. 
}   /

namespace B {  \ 
using namespace A; | <-- namespace B scope. "i" is visible after 
void bar()   |  the "using namespace" line. 
{     | 
    i += 1; /*Ok*/ |  
}     | 
}    /

namespace B {  \ 
void foo()   | 
{     | <-- still namespace B scope. "i" is still visible 
    i += 1; /*Ok*/ | 
}     | 
}    /

所以東西做這個使用指令可見的將隨處可見的using namespace B行之後範圍。當然,如果你在頭文件中這樣做,所有的東西在你包含頭文件的地方都可以看到,所以你不應該在頭文件的任何地方真正使用「using namespace ...」。

+0

'i + = 1'可以進入命名空間範圍嗎? – 0x499602D2

+0

@ 0x499602D2,當然不是,我忘了把它包裝在一個函數中。謝謝 – SingerOfTheFall

0

我覺得按照命名空間的理論,你的問題是正確的,因爲這種機制用於由庫定義的名字推杆成一個單一的 地方,它有助於避免無意名稱衝突

1

在命名空間塊中的using語句對同一命名空間的所有塊是否有效?

當使用指令在翻譯單元(包含)中可見時,是的。

封閉命名空間導致的污染是爲什麼你不把這些語句放在頭文件中,或者在名稱空間範圍內避免它們。

參考: