【MQL5】名前空間とnamespaceキーワードについて。

MQL5でEA作ろう講座
スポンサーリンク
スポンサーリンク

namespace キーワードの意味

namespace キーワードは、MQL5において名前空間を定義するために使用されます。

名前空間について

名前空間は、識別子変数関数クラスなど)のスコープを管理し、名前の衝突を避けるための機能です。
名前の衝突とは、プログラム内で同じ名前の変数関数、またはクラスが複数存在するために、どの名前がどの要素を指しているのかが不明確になる現象です。これにより、予期しない動作やエラーが発生する可能性があります。

例えば、同じ名前の変数がグローバルスコープとローカルスコープの両方で定義される場合、どの変数を使用するかが曖昧になります。また、異なるライブラリが同じ名前の関数を提供している場合、どの関数を呼び出すかが不明確になります。さらに、異なるプログラムファイルで同じ名前のクラスが定義されている場合、どのクラスインスタンス化するかが混乱する可能性があります。

名前の衝突を避けるために、名前空間を使用して識別子をグループ化し、スコープを管理します。これにより、異なるコンテキストで同じ名前を使用できるようになります。

C++やC#などの他のプログラミング言語と同様に、MQL5でも名前空間を使用してコードを整理し、異なるモジュール(プログラムファイル)間での名前の重複を防ぎます。

名前空間の使い方

以下に、MQL5での名前空間の定義と使用方法について説明します。

名前空間の定義

名前空間を定義するには、namespaceキーワードを使用します。名前空間内に定義された識別子は、その名前空間のスコープ内でのみ有効です。

// MyNamespaceという名前空間を定義します
namespace MyNamespace {
  // 名前空間内に整数型の変数myVariableを定義し、初期値として10を代入します
  int myVariable = 10;

  // 名前空間内にMyFunctionという名前の関数を定義します
  void MyFunction() {
    // 関数が呼び出されたときにメッセージを出力します
    Print("This is a function within MyNamespace.");
  }
}

一見すると、クラス関数の定義のように見えるかもしれませんが、名前空間は、クラスでも関数でもなく、変数関数をまとめたものです。名前空間は、識別子変数関数クラスなど)をグループ化して整理するための方法です。

このコードは、MyNamespaceという名前空間を定義し、その中に変数関数をまとめています。具体的には、整数型変数myVariableを定義し、その初期値を10としています。また、MyFunctionという名前の関数を定義し、この関数が呼び出されたときに「This is a function within MyNamespace.」というメッセージを出力します

名前空間の使用

名前空間内の識別子を使用するには、「::」という スコープ解決演算子を使用します。

void OnStart() {
  // 名前空間内の変数を使用
  int value = MyNamespace::myVariable;

  // 名前空間内の関数を呼び出し
  MyNamespace::MyFunction();
}

このコードは、OnStart関数内で名前空間MyNamespaceに定義された変数関数を使用する方法を示しています。

MyNamespace名前空間内に定義された変数myVariableの値を取得し、その値をvalueという名前の変数代入しています。MyNamespace::myVariableという形式で名前空間を指定することで、myVariableがMyNamespace名前空間内の変数であることを明示しています。

名前空間のエイリアス

名前空間エイリアスを作成することで、長い名名前空間を短縮して使うことができます。以下のコード例で説明します。

名前空間エイリアスは、元の名前空間の代わりに使うための便宜的な表現です。

namespace MyNamespace {
  int myVariable = 10;

  void MyFunction() {
    Print("This is a function within MyNamespace.");
  }
}

// エイリアスの定義
namespace MN = MyNamespace;

void OnStart() {
  // エイリアスを使用して名前空間内の変数と関数を参照
  int value = MN::myVariable;
  MN::MyFunction();
}

このコードでは、MyNamespaceという名前空間を定義し、その中に変数myVariableと関数MyFunctionを含めています。その後、namespace MN = MyNamespace;という文でMyNamespaceのエイリアスMNを定義しています。これにより、MNを使ってMyNamespace内の要素にアクセスすることができます。

エイリアスを作成しても、元の名前空間は引き続き使用可能です。エイリアスは元の名前空間への別名を提供するものであり、元の名前空間を無効にするものではありません。エイリアスと元の名前空間の両方を使ってアクセスすることができます。

以下のコードは、元の名前空間エイリアスの両方を使用して変数関数にアクセスする方法を示しています。

namespace MyNamespace {
  int myVariable = 10;

  void MyFunction() {
    Print("This is a function within MyNamespace.");
  }
}

// エイリアスの定義
namespace MN = MyNamespace;

void OnStart() {
  // 元の名前空間を使用
  int value1 = MyNamespace::myVariable;
  MyNamespace::MyFunction();
  
  // エイリアスを使用
  int value2 = MN::myVariable;
  MN::MyFunction();
}

名前空間を使用してまとめられた識別子変数関数クラスなど)は、名前空間を指定しないと呼び出して使うことができません。名前空間を指定することで、他の名前空間やグローバルスコープ内の同じ名前の識別子と区別することができます。

具体例

以下の例を参考にしてください。

namespace MyNamespace {
  int myVariable = 10;

  void MyFunction() {
    Print("This is a function within MyNamespace.");
  }
}

void OnStart() {
  // 名前空間を指定せずにアクセスしようとするとエラーが発生します
  // int value = myVariable;         // エラー
  // MyFunction();                  // エラー
  
  // 名前空間を指定してアクセスする
  int value = MyNamespace::myVariable;
  MyNamespace::MyFunction();
  
  // エイリアスを使用してアクセスする
  namespace MN = MyNamespace;
  int value2 = MN::myVariable;
  MN::MyFunction();
}

名前空間を指定せずに、名前空間内の識別子にアクセスしようとした場合

名前空間を使用してまとめられた識別子変数関数クラスなど)は、名前空間を指定しないと呼び出して使うことができません。名前空間を指定することで、他の名前空間やグローバルスコープ内の同じ名前の識別子と区別することができます。

具体例

以下の例を参考にしてください。

namespace MyNamespace {
  int myVariable = 10;

  void MyFunction() {
    Print("This is a function within MyNamespace.");
  }
}

void OnStart() {
  // 名前空間を指定せずにアクセスしようとするとエラーが発生します
  // int value = myVariable;         // エラー
  // MyFunction();                  // エラー

  // 名前空間を指定してアクセスする
  int value = MyNamespace::myVariable;
  MyNamespace::MyFunction();

  // エイリアスを使用してアクセスする
  namespace MN = MyNamespace;
  int value2 = MN::myVariable;
  MN::MyFunction();
}

解説

  • 名前空間を指定しない場合:
    myVariableやMyFunctionを直接呼び出そうとすると、MQL5コンパイラはそれらが定義されていないとしてエラーを出します。名前空間内の識別子は、その名前空間を指定することで初めてアクセス可能となります。
  • 名前空間を指定する場合:
    MyNamespace::myVariableやMyNamespace::MyFunctionとすることで、名前空間内の識別子に正しくアクセスできます。
  • エイリアスを使用する場合:
    名前空間MyNamespaceのエイリアスMNを定義し、MN::myVariableやMN::MyFunctionを使用して同じ識別子にアクセスできます。エイリアスは元の名前空間を使いやすくするためのショートカットです。

まとめ

名前空間を使用してまとめられた識別子は、必ず名前空間を指定してアクセスする必要があります。これにより、名前の衝突を避け、コードを整理しやすくすることができます。

コメント

タイトルとURLをコピーしました