C++ の名前空間

胡金庫 2023年10月12日
  1. C++ で namespace キーワードを使用して新しい名前空間を作成する
  2. C++ でネストされた名前空間を使用して複雑なスコープを実装する
C++ の名前空間

この記事では、C++ で名前空間を使用する方法について説明します。

C++ で namespace キーワードを使用して新しい名前空間を作成する

C++ には、名前の競合と呼ばれる大規模なプロジェクトで一般的な問題を防ぐのに役立つ名前空間の概念があります。特定のプロジェクトが独立したチームによって開発されたさまざまなライブラリを使用し、さまざまなオブジェクトに多くのグローバル名がある場合、一部の名前が一致してエラーが発生することが避けられなくなります。名前空間は、関数または他のオブジェクトの特定の名前が定義されているスコープを宣言します。C++ には、オブジェクトの名前がさまざまなコード領域でどのように表示され、使用できるかを管理する自動スコープルールがあることに注意してください。たとえば、関数で宣言されたローカル変数は、関数本体の外部では表示またはアクセスできません。したがって、同じ名前の別の変数を、競合することなく、この関数の本体の外部で宣言できます。一方、単一のグローバルスコープは、ファイルまたは関数全体で特定のオブジェクトを使用できるようにするために、大規模なプログラムでよく使用されます。ここで、手動のスコープメカニズムのないスペースを管理する方法を想像してみてください。

実際、プログラマーは、グローバルオブジェクトに非常に長い名前を使用して名前の衝突を処理していました。比較的小規模なプロジェクトでも機能しますが、コードの読み取りが非常に面倒になり、調整された命名スキームがないと、ソリューションで名前の衝突を防ぐことはできません。
名前空間は、グローバルスコープ(結果的に名前空間と呼ばれる)を分割するメカニズムを提供します。名前空間は、namespace キーワードの後に​​名前空間名自体を付けて宣言されます。次に、関数ブロックと同様に中括弧で囲まれたコードに従い、セミコロンなしで終了します。同じ自動スコープルールが、コードの他の部分と同じ名前空間内の変数を管理します。名前空間の外部からアクセスする必要のあるオブジェクト名は、それらが定義されている名前空間名で始まり、その後に二重コロン表記が続き、次にオブジェクト名が続く必要があります。次のコード例は、同じファイル内の名前空間の基本的な使用例を示しています。

#include <iostream>

using std::cout;
using std::endl;

namespace dinno {
int var1 = 456;
}

int main() {
  int var1 = 123;

  cout << var1 << endl;
  cout << dinno::var1 << endl;

  return EXIT_SUCCESS;
}

出力:

123
456

C++ でネストされた名前空間を使用して複雑なスコープを実装する

名前空間は、ループステートメントと同様にネストできます。デフォルトでは、ネストされた名前空間は外部名前空間のオブジェクト名にアクセスできますが、後者(親名前空間と呼ばれることが多い)は内部名前空間のメンバーにアクセスできません。ただし、内部名前空間宣言の前にキーワード inline を指定して、そのメンバーを親名前空間でアクセスできるようにすることができます。名前空間はさまざまな場所で定義できます。つまり、次の例で dinno 名前空間が定義されているため、同じ名前空間定義が異なるファイルにまたがったり、単一ファイル内の別々の場所にまたがったりする可能性があります。

#include <iostream>

using std::cout;
using std::endl;

namespace dinno {
int var1 = 456;
}

namespace gini {
int var1 = 980;

namespace bean {
int var1 = 199;
}
}  // namespace gini

namespace dinno {
int var2 = 990;
}

int var1 = 123;

int main() {
  cout << var1 << endl;
  cout << dinno::var1 << endl;
  cout << gini::var1 << endl;
  cout << dinno::var2 << endl;
  cout << gini::bean::var1 << endl;

  return EXIT_SUCCESS;
}

出力:

123
456
980
990
199
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook