名前のない名前空間とグローバル宣言の使用の違いは何ですか?
これら2つを使用するための特定のコンテキストはありますか?
外部ソース ファイル内の無名の名前空間コンポーネントにアクセスできますか?
質問する
3281 次
1 に答える
11
名前のない名前空間のポイントは、明示的なプレフィックスを必要とせずに、翻訳単位 (= ソース ファイル) 内で一意の名前空間を提供することです。これにより、グローバル名が他の翻訳単位の他の同等のグローバル名と衝突しないことが保証されます。
例えば:
// file1.cpp
namespace
{
void foo() { /* ... */ }
}
#include "bar.h"
int do_stuff()
{
foo();
bar();
return 5;
}
// file2.cpp
namespace
{
void foo() { /* ... */ }
}
#include "bar.h"
int do_something else()
{
bar();
foo();
return 12;
}
これら 2 つの翻訳単位をリンクすると、2 つの名前がそれぞれのファイルで定義された関数を参照することを確実に知ることがfoo
でき、1 つの定義規則に違反することはありません。
技術的には、名前のない名前空間は次のように考えることができます。
namespace unique_and_unknowable_name
{
// ...
}
using namespace unique_and_unknowable_name;
このツールがなければ、ODR に違反していないことを保証できる唯一の方法は、static
宣言を使用することです。ただし、微妙な違いがあります。それstatic
はリンケージに影響しますが、名前空間には影響しません。
于 2013-08-14T19:25:25.893 に答える