build600の追加機能で、デバッグの心強い味方
定義済みマクロという機能がメタエディターのbuild600で実装されました。
定義済みマクロとは、MQL4プログラムに関する情報を取得して、デバッグを支援するための定数のことです。
“マクロ”という文言は、とっつきにくい印象を与えますが無視して構いません。この文言自体は、この際どうでも良いです。
定義済みマクロを使うことで、定義済みマクロを埋め込んだソースコードの行数やファイル名、関数名等を出力できるようになります。
従って、デバッグではPrint()文と定義済みマクロを併用すると良いでしょう。
定義済みマクロの詳細はこちらをご覧ください。
全9種類の定義済みマクロがありますが、使いやすそうなのは以下の3つでしょうか。
- __LINE__ (マクロを配置したソースコードの行数)
- __FILE__ (コンパイルしたファイル名)
- __FUNCTION__ (マクロが配置された関数名)
私は以下のように使うことにしました。
Print("File: ", __FILE__, " Function: ", __FUNCTION__, " メッセージ内容");
__LINE__は無くても良いかなと。何千、何万行のコードを書くことは殆どなく、ファイル名と関数名とメッセージ内容が分かれば該当箇所はすぐ特定できますので。
以下、蛇足です。
全9種類の定義済みマクロのうち、__FUNCSIG__が分かりにくいと思いますが、これは関数名だけでなく戻り値と引数の型も含めて出力します。
例えば、OnTick関数内で__FUNCTION__を呼び出せば「OnTick」が出力され、__FUNCSIG__を呼び出せば「void OnTick()」が出力されます。
何のために__FUNCSIG__が用意されているかというと、関数のオーバーロードを使用している場合に、同じ関数名のうち、どの種類が呼び出されたかを識別するためです。
「MQL4で定義済みの定数を利用する」にはオーバーライドと書いてありますけど、これは間違いです。原文のリファレンスを見れば、overloaded(オーバーロード)とはっきりと書いてあります。
オーバーライドとオーバーロードは似た表現ですが、意味が全然違いますのでご注意ください。このサイト、他の記事でも嘘が書いてあるのを見たことがあるので信用できません。
2017/10/7追記:上記リンク先の記事「MQL4で定義済みの定数を利用する」が削除されましたので、リンクを解除しました。
オーバーライドとかオーバーロードって何?という声が聞こえてきそうですが、そういう方はぜひググって調べてみてください。
まぁ、オブジェクト思考でプログラミングしない人には殆ど関係ありませんし、オブジェクト指向でプログラミングする場合でも、オーバーロードはそんなに使う機能ではないので(頻繁に使うのは逆に良くないので)、気にする必要はないかなとは思いますが。