名前のない名前空間が使用される理由とその利点は何ですか?

264
Scottie T 2008-12-11 10:03.

新しいC ++ソフトウェアプロジェクトに参加したばかりで、デザインを理解しようとしています。プロジェクトでは、名前のない名前空間を頻繁に使用します。たとえば、次のようなことがクラス定義ファイルで発生する可能性があります。

// newusertype.cc
namespace {
  const int SIZE_OF_ARRAY_X;
  const int SIZE_OF_ARRAY_Y;
  bool getState(userType*,otherUserType*);
}

newusertype::newusertype(...) {...

名前のない名前空間を使用する原因となる可能性のある設計上の考慮事項は何ですか?長所と短所は何ですか?

6 answers

201
Johannes Schaub - litb 2008-12-11 10:19.

名前空間は、識別子変換ユニットをローカルにするためのユーティリティです。これらは、名前空間の翻訳単位ごとに一意の名前を選択するかのように動作します。

namespace unique { /* empty */ }
using namespace unique;
namespace unique { /* namespace body. stuff in here */ }

空の本体を使用する追加の手順は重要です::name。usingディレクティブがすでに実行されているため、名前空間本体内で、その名前空間で定義されているような識別子をすでに参照できます。

これはhelp、複数の変換ユニットに存在できる(たとえば)と呼ばれる無料の関数を持つことができ、リンク時に衝突しないことを意味します。効果はstatic、識別子の宣言に入れることができるCで使用されるキーワードを使用するのとほとんど同じです。名前のない名前空間は優れた代替手段であり、型変換ユニットをローカルにすることもできます。

namespace { int a1; }
static int a2;

どちらもaローカルの変換単位であり、リンク時に衝突しません。ただし、違いはa1、匿名名前空間のが一意の名前を取得することです。

comeau-computingの優れた記事を読むなぜ静的ではなく名前のない名前空間が使用されるのですか?(Archive.orgミラー)。

81
Motti 2008-12-11 10:08.

匿名の名前空間に何かがあるということは、それがこの変換ユニット(.cppファイルとそのすべてのインクルード)に対してローカルであることを意味します。これは、同じ名前の別のシンボルが他の場所で定義されている場合、単一定義規則(ODR)に違反しないことを意味します。

これは、静的グローバル変数または静的関数を持つCの方法と同じですが、クラス定義にも使用できます(staticC ++ではなく使用する必要があります)。

同じファイル内のすべての匿名名前空間は同じ名前空間として扱われ、異なるファイル内のすべての匿名名前空間は区別されます。匿名の名前空間は、次のものと同等です。

namespace __unique_compiler_generated_identifer0x42 {
    ...
}
using namespace __unique_compiler_generated_identifer0x42;
20
Sachin 2016-05-27 06:56.

名前空間は、クラス、変数、関数、およびオブジェクトへのアクセスを、それが定義されているファイルに制限します。名前空間の機能はstatic、C / C ++のキーワードに似ています。
staticキーワードは、グローバル変数と関数のアクセスを、それらが定義されているファイルに制限します。
名前空間とstaticキーワードには違いがあります。これは、名前空間が静的よりも優れているためです。staticキーワードは変数、関数、オブジェクトで使用できますが、ユーザー定義クラスでは使用できません。
例えば:

static int x;  // Correct 

だが、

static class xyz {/*Body of class*/} //Wrong
static structure {/*Body of structure*/} //Wrong

ただし、名前のない名前空間でも同じことが可能です。例えば、

 namespace {
           class xyz {/*Body of class*/}
           static structure {/*Body of structure*/}
  } //Correct
15
xioxox 2014-08-29 23:19.

この質問に対する他の回答に加えて、匿名の名前空間を使用すると、パフォーマンスを向上させることもできます。名前空間内のシンボルは外部リンケージを必要としないため、コンパイラーは名前空間内のコードの積極的な最適化をより自由に実行できます。たとえば、ループ内で1回複数回呼び出される関数は、コードサイズに影響を与えることなくインライン化できます。

たとえば、私のシステムでは、匿名の名前空間が使用されている場合、次のコードは実行時間の約70%を要します(x86-64 gcc-4.6.3および-O2; add_valの余分なコードにより、コンパイラーは含めたくないことに注意してください2回)。

#include <iostream>

namespace {
  double a;
  void b(double x)
  {
    a -= x;
  }
  void add_val(double x)
  {
    a += x;
    if(x==0.01) b(0);
    if(x==0.02) b(0.6);
    if(x==0.03) b(-0.1);
    if(x==0.04) b(0.4);
  }
}

int main()
{
  a = 0;
  for(int i=0; i<1000000000; ++i)
    {
      add_val(i*1e-10);
    }
  std::cout << a << '\n';
  return 0;
}
12
Max Lybbert 2008-12-11 10:10.

匿名の名前空間は、囲まれた変数、関数、クラスなどをそのファイル内でのみ使用できるようにします。あなたの例では、それはグローバル変数を回避する方法です。実行時またはコンパイル時のパフォーマンスの違いはありません。

「この変数、関数、クラスなどをパブリックにするかプライベートにするか」以外に、それほど長所と短所はありません。

12
Marc Mutz - mmutz 2009-07-25 07:20.

この例は、あなたが参加したプロジェクトの人々が匿名の名前空間を理解していないことを示しています:)

namespace {
    const int SIZE_OF_ARRAY_X;
    const int SIZE_OF_ARRAY_Y;

constオブジェクトにはすでに静的なリンクがあり、別の翻訳単位の同じ名前の識別子と競合する可能性がないため、これらは匿名の名前空間にある必要はありません。

    bool getState(userType*,otherUserType*);
}

そして、これは実際には悲観的なものですgetState()。外部とのつながりがあります。シンボルテーブルを汚染しないため、通常は静的リンケージを選択することをお勧めします。書く方がいい

static bool getState(/*...*/);

ここに。私は同じ罠に陥りました(ファイル静的は匿名の名前空間を支持して非推奨になることを示唆する標準の文言があります)が、KDEのような大規模なC ++プロジェクトで作業すると、頭を正しい方向に向ける多くの人々がいます再び周り:)

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ラーム・エマニュエルがシカゴ警察の警視を解雇し、身を守る

ラーム・エマニュエルがシカゴ警察の警視を解雇し、身を守る

シカゴ市長のラーム・エマニュエルは、シカゴの警察官による17歳のラカン・マクドナルドの銃撃の失敗した取り扱いに続いて、市の警視官、ギャリーF.マッカーシーを解雇しました。

ダグ・マローネの理想的な食事は、ボローニャのサンドイッチです。

ダグ・マローネの理想的な食事は、ボローニャのサンドイッチです。

写真:ローガンボウルズ/ゲッティイメージズジャイアンツがベンマカドゥーを解雇したので、他の誰かがジムトムスラの精神的後継者でなければなりません。季節だった。ジャガーズのダグ・マローネ監督は、孤独なボローニャサンドイッチに親しみを持っていることを考えると、すでにその役割を担う有力な候補者のようです。

人々がやめる最も一般的な時間、およびプッシュスルーする方法

人々がやめる最も一般的な時間、およびプッシュスルーする方法

時には、それが副次的なプロジェクト、仕事、人間関係、または人生の他の部分であるかどうかにかかわらず、辞めることが最良の選択肢です。しかし、何かを完了するためのリソースがないため、物事が困難になったとき、タイミングが私たちに必要なように「感じ」させたときにも、私たちは辞めます。

黒人女性、あなたの内訳へようこそ

黒人女性、あなたの内訳へようこそ

著者のベニルデ・リトルは、母親の死後のうつ病との戦いを新しい回想録「Welcome toMyBreakdown」で記録しています。チェスター・トイの作家ベニルデ・リトルは、黒人女性にそれが大丈夫だと知ってもらいたいと思っています。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language