2011-10-06 262 views
4

命名空間{INT美孚(INT A); }C++命名空間....匿名命名空間是合法的?

篩選。這段代碼段合法嗎?

這合法嗎?而且,我可以在任何地方參考Foo嗎?或只有某些域?

謝謝。

+0

[在靜態具名命名空間的優勢的可能重複?](http://stackoverflow.com/questions/4422507/superiority-of- unnamed-namespace-over-static) – Nawaz

+0

這是合法的,但意味着與常規名稱空間不同。 :) – jalf

回答

8

這是合法的,您可以在同一個Translation Unit的任何地方使用Foo

匿名命名空間是說對變量static其範圍限制在同一翻譯單位的標準所規定的方式。

C++ 03標準節7.3.1.1未命名空間

第2段:

使用static關鍵字的命名空間中的範圍聲明對象時已被棄用,無名的命名空間提供了一個更好的選擇


更新:
作爲@Matthieu M.正確地指出中的註釋和his answer的C++ 11標準從C++ 03標準,這意味着除去上述報價在命名空間範圍內聲明對象時不推薦使用static關鍵字,但匿名或未命名的名稱空間仍然有效。

+0

我的答案略有不同,但更正確一點,我認爲;) –

+0

@BjörnPollex:啊,這是我的第二次編輯使我們的答案相同lol –

+0

現在我們都添加了標準報價:) –

4

這是合法的。您可以在翻譯單元的任何地方參考Foo

從C++ 03標準,第7.3.1.1:

一個未命名的名稱空間定義的行爲就好像它是由

namespace unique { /* empty body */ } using namespace unique; 
namespace unique { namespace-body } 

替換其中的unique所有出現 翻譯單元由相同的標識符替換和本 標識符從在整個程序中所有其他標識符不同。

使用static關鍵字的在 一個命名空間聲明範圍的對象時不推薦使用; unnamed命名空間提供了一個優越的替代選項 。

+0

'unnamed-namespace-definition的行爲就好像它被替換爲...' 。我懇求在這裏有所不同。如果沒有命名'namespace',你可以在裏面聲明/定義一個變量。但是,如果命名空間不正常(因爲它會導致多個符號鏈接器錯誤)。所以兩者都沒有相同的效果。 – iammilind

+3

@iammilind:由於所有翻譯單元的「唯一」(這是該名稱空間的名稱)是不同的,因此永遠不會有多重定義的符號。此外,這是一個標準的引用,所以如果你不同意,請與委員會討論;) –

+0

好吧,我認爲'unique'只是一個名字。我不知道標準委員會會把這種令人困惑的例子:))。可能是'命名空間 {...}使用命名空間;'會是適當的措辭。 – iammilind

2

定義略微在C++ 11標準改變:

7.3.1.1未命名空間[命名空間。無名]

1/一個未命名的名稱空間定義的行爲就好像它是由

inlineoptnamespace unique { /* empty body */ } 
using namespace unique ; 
namespace unique { namespace-body } 

其中內嵌出現替換當且僅當它出現在未命名-namespace-定義中,翻譯單元中唯一的所有事件被相同的標識符替代,並且該標識符不同於整個程序中的所有其他標識符.94 [例如:

namespace { int i; } // unique ::i 
void f() { i++; } // unique ::i++ 

namespace A { 
    namespace { 
    int i; // A:: unique ::i 
    int j; // A:: unique ::j 
    } 
    void g() { i++; } // A:: unique ::i++ 
} 

using namespace A; 

void h() { 
    i++; // error: unique ::i or A:: unique ::i 
    A::i++; // A:: unique ::i 
    j++; // A:: unique ::j 
} 

末端示例]