web-dev-qa-db-ja.com

ヘッダーとソースでのC ++名前空間の作成(cpp)

名前空間でヘッダーとcppファイルの両方のコンテンツをラップすることと、ヘッダーコンテンツのみをラップしてからcppファイルで名前空間を使用を実行することとの間に違いはありますか?

違いとして、私はあらゆる種類のパフォーマンスの低下、または問題を引き起こす可能性のあるわずかに異なるセマンティクスまたは私が知っておく必要があるものを意味します。

例:

// header
namespace X
{
  class Foo
  {
  public:
    void TheFunc();
  };
}

// cpp
namespace X
{
  void Foo::TheFunc()
  {
    return;
  }
}

VS

// header
namespace X
{
  class Foo
  {
  public:
    void TheFunc();
  };
}

// cpp
using namespace X;
{
  void Foo::TheFunc()
  {
    return;
  }
} 

違いがない場合、推奨される形式は何ですか?その理由は何ですか?

76
links77

名前空間は、関数のシグニチャーをマングルして競合しないようにするための単なる方法です。最初の方法を好む人もいれば、2番目のバージョンを好む人もいます。どちらのバージョンも、コンパイル時のパフォーマンスには影響しません。名前空間は単なるコンパイル時のエンティティであることに注意してください。

名前空間の使用で発生する唯一の問題は、同じネストされた名前空間名(つまり)X::X::Foo。これを行うと、キーワードの使用の有無にかかわらず、さらに混乱が生じます。

35
vprajan

「名前空間X」と「名前空間Xを使用」の違いは、最初の宣言では新しい宣言が名前空間の下にありますが、2番目の宣言ではそうではありません。

あなたの例では、新しい宣言はありません-そのため、差がないため、優先される方法はありません。

45
Roee Gavirel

結果は同じになる可能性があるため、パフォーマンスのペナルティはありませんが、Fooをネームスペースに入れると、Foosが異なるネームスペースにある場合に暗黙的にあいまいさが生じます。確かに、あなたはコードを取得することができます。この目的でusingの使用を避けることをお勧めします。

そして、あなたは迷いを持っています{using namespace ;-)

2番目のものもコンパイルされる場合、違いはないはずです。名前空間はコンパイル時に処理され、ランタイムアクションに影響を与えません。

しかし、設計上の問題については、2番目は恐ろしいです。コンパイルしたとしても(確実ではありません)、まったく意味がありません。

1
holgac

Foo :: TheFunc()は、VSケースの正しい名前空間にありません。 'void X :: Foo :: TheFunc(){}'を使用して、正しいネームスペース(X)で関数を実装します。

1
bert-jan

.hコンテンツのみをラップする場合は、cppファイルでnamespace ...を使用して記述する必要があります。それ以外の場合は、有効なネームスペースで作業するたびに。通常、.cppファイルと.hファイルの両方をラップします。そうしないと、別のネームスペースのオブジェクトを使用するリスクが生じ、多くの問題が発生する可能性があります。

0
AlexTheo

ここで正しいことは、スコープに名前空間を使用することだと思います。

namespace catagory
{
    enum status
    {
      none,
      active,
      paused
    }
};

void func()
{
    catagory::status status;
    status = category::active;
}
0