Cpp NameSpace

提供:yonewiki
2022年9月26日 (月) 10:58時点におけるYo-net (トーク | 投稿記録)による版 (ページの作成:「C++に戻る <table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner"> <tr> <td style="width:1px;"></td> <td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++(Cpp) NameSpace</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。</td> </t…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

C++に戻る


本来の表記は「C++(Cpp) NameSpace」です。この記事に付けられた題名はテンプレート:記事名の制約から不正確なものとなっています。

※このページではC++にのみ存在する機能として、記事タイトルがC++ NameSpaceになっています。

namespace

namespaceは日本語では「名前空間」と表現されるもので、クラス名を明確にしたり、プログラムの記述部に名前をつけるものです。このような名前の付与はクラス名や関数名の衝突を避けるための手法として役立ちます。

例えばTestCodeという名前のnamespaceの定義方法は

namespace TestCode{
  int Function(){return 1;};
  Class CTestClass{
    int TestFunc();
  };
  namespace TestCode2{
    int Function(){return 2;};
  }

}

といった具合に名前を付けたい領域を{}で囲った上で名前を付与します。このような名前の付与は入れ子にすることも可能で、定義したクラスや関数はスコープ解決演算子 :: を用いて、明確に指定することができます。

例えば

1を返却する関数Functionを呼び出す場合には

nReturn = TestCode::Function();

と上記のように指定し、

2を返却する関数Functionを呼び出す場合には

nReturn = TestCode::TestCode2::Function();

のようにスコープ解決演算子を階層指定するような感じで記述することで、同じ名前の関数についても明確に区分けして呼び出すことができます。同一の名前のクラス名や関数名が使われることは稀ですが、どうしても重複してしまうような場合には、このような名前空間の定義を用いて区分けすることができます。

クラスCTestClassの中のTestFuncメンバ関数を定義する場合には、同一の名前空間上定義する必要があるため

namespace TestCode{
  int CTestFunc::TestFunc(){
    return 1;
  }
}

のようにして定義します。あるいはnamespaceによる空間設定を省略した表記として

int TestCode::CTestFunc::TestFunc(){
  return 1;
}

と書くことも出来ます。


長い名前空間を別の名前に置き換えたりするために以下のような定義によって置き換えることができます。

namespace Test = TestCode::TestCode2;

int _tmain(int argc, _TCHAR* argv[])
{
  
  nReturn = Test::Function();
  
  return 0;
}

階層になっていない名前空間についても同様に別の名前を設定できますが、あまり意味のない名前の付け替えは混乱のもとになります。階層が長くなり過ぎる場合など有用な使い方に限定した方が良いでしょう。


標準namespace

 C++標準の関数はstdという名前空間に定義されています。なので、標準関数を使うなら、とりあえずusing namespace std;として記述 しておくのが良いとされています。良くないとも言っている人もいます。C++標準で使われている関数名と重複しない関数の命名をしていれば、使った方が良いと思います。一部の関数しか使わないとわかっているならusing namespace std::cin;といったように何回も使う標準関数だけをusingで名前空間を設定すると良いのかもしれません。そんなん余計面倒と思うなら標準関数の全ての命名規則を把握しておいて、こういう関数名の定義方法なら重複しないな。という手順をとった方が楽かもしれません。名前空間stdの中にある関数を利用するプログラムファイルについては、プロジェクトに含まれるファイルのそれぞれでusing namespace std; と記載する必要があります。


 標準関数内では、実際は#define _STD_BEGIN namespase std { と _STD_END } とマクロ定義されているので、標準関数プログラムでは_STD_BEGINと_STD_ENDで囲まれて、名前空間を定義しています。ちゃんと名前空間std内にあります。確かめたい人は確かめてみて下さい。


 どんな関数が標準関数として用意されているのかは、それぞれの標準関数ヘッダファイルを開いて、正規表現検索で

  • C言語の<xx.h>標準ヘッダファイル
__CRTDECL (?!_)(.*)\(
  • C++の<xxxx>標準ヘッダファイル
__PURE_APPDOMAIN_GLOBAL(.*) (.*)[\(;]


とすると、比較的眺めやすいカタチで眺めることが出来ます。#includeで取り込んだヘッダファイル名を選択して右クリックするとヘッダファイルを開く項目がありますので、それで開いてCtrl+Fで検索ツールが出てきて、大文字と小文字を区別するオプションと正規表現モードを有効にして、検索できます。__が付いてる関数は似たような関数を作るためのものなので、インクルードした時に使っちゃいけない関数名を知るという段階においてはあまり気にしなくて良いと思います。


C++に戻る