2011-06-26 26 views
4

次のコードがあります:私はg ++の使用無名名前空間

#include <iostream> 

using namespace std; 

namespace 
{ 
    int funkcja() 
    { 
     cout << "unnamed" << endl; 
     return 0; 
    } 
} 

int funkcja() 
{ 
    cout << "global" << endl; 
    return 0; 
} 

int main() 
{ 
    ::funkcja(); //this works, it will call funkcja() from global scope 
    funkcja(); //this generates an error 
    return 0;  
} 

が。このような状況で名前のない名前空間から関数を呼び出す方法はありますか? :: functionを使ってグローバルスコープから関数を呼び出すことはできますが、名前のない名前空間から関数を呼び出す方法はありますか?コンパイラはエラーを生成します。

prog3.cpp: In function ‘int main()’: 
prog3.cpp:43:17: error: call of overloaded ‘funkcja()’ is ambiguous 
prog3.cpp:32:5: note: candidates are: int funkcja() 
prog3.cpp:25:6: note:     int<unnamed>::funkcja() 

答えて

2

このような状況で名前のない名前空間から関数を呼び出す方法はありますか?
いいえ、あなたの場合はありません。

匿名/名前名前空間は、変数と関数全体翻訳単位内に見えるようにできるように、まだ外部からは見えません。名前のない名前空間のエンティティは外部リンケージを持つことができますが、翻訳単位固有の名前で修飾されているため、他の翻訳単位からは見えません。

これは、グローバル関数funkcjaを定義する翻訳単位で、名前空間内の関数funkcjaが表示されることを意味します。これにより、グローバルスコープで定義された2つの同じ名前付き関数が発生し、再定義エラーが発生します。

funkcjaがUnNamedネームスペースにのみ存在していた場合は、::funkcjaという名前でグローバルスコープ内にあるように呼び出すことができました。結論として、UnNamed名前空間が存在するスコープに応じて、UnNamed名前空間の関数を呼び出すことができます。

4

匿名の名前空間が動作する方法はusing namespace name_of_anonymous_namespace;が発行されたかのようにそれらの内部で宣言されて名前が囲みスコープ内で自動的に表示されていることです。

このため、あなたの例では、名前funkcjaはあいまいで曖昧さのない[新しい単語!]です。匿名の名前空間が本当に必要ないように見えますが、実際には適切に名前付きの名前空間が必要です。