9

名前のない名前空間とグローバル宣言の使用の違いは何ですか?
これら2つを使用するための特定のコンテキストはありますか?
外部ソース ファイル内の無名の名前空間コンポーネントにアクセスできますか?

4

1 に答える 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 に答える