35

名前のない名前空間を使用する場合、別の名前空間内にネストされていると問題が発生しますか?たとえば、次のコードでFoo1.cppとFoo2.cppの間に実際の違いはありますか。

// Foo.h
namespace Foo
{
    void fooFunc();
}

// Foo1.cpp
namespace Foo
{
    namespace
    {
        void privateFunction()
        {
            ...
        }
    }

    void fooFunc()
    {
        privateFunction();
    }
}

// Foo2.cpp
namespace
{
    void privateFunction()
    {
        ...
    }
}

namespace Foo
{
    void fooFunc()
    {
        privateFunction();
    }
}
4

2 に答える 2

33

名前のない名前空間は、知らない一意の名前を持つ通常の名前空間と見なすことができます。C++ 標準 7.3.1.1 によると:

unnamed-namespace-definition は、

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

ここで、翻訳単位内のすべての一意の出現は同じ識別子に置き換えられ、この識別子はプログラム全体の他のすべての識別子とは異なります。

追加の問題はありません。

于 2010-01-19T14:43:46.443 に答える
4

おそらく、あなたの目的には本当の違いはありません。cpp ファイルのどこに表示されるかが異なりますprivateFunction。両方のファイルの最後に追加void barFunc() { privateFunction(); }すると、Foo2.cpp はコンパイルされ、Foo1.cpp はコンパイルされません。

通常、同じ cpp ファイル内の多くの異なる名前空間から外部シンボルを定義しないため、違いは生じません。

于 2010-01-19T14:44:36.740 に答える