概要
古い本や古いサンプルで勉強していたので今までは宣言前にexternで指定していました。
というよりほぼコピペ。
で、本腰入れるようになってから見かけたのがinputです。
どちらも外部パラメータを使用する値を宣言する際に付する変数ですが微妙に違いがることに気づきました。
ドキュメントの一部を抜粋
ドキュメントだとつらつら書かれて読みにくかったので改行を入れて、重要な部分に背景色を入れました。
input変数
inputストレージクラスは、外部変数を定義しています。
input修飾子は、データ型の前に示されます。
input修飾子を持つ変数はMQL5プログラム内で変更することはできず、読み込み専用でアクセスすることが出来ます。
input変数の値はプログラムのプロパティウィンドウから、ユーザによってのみ変更することが出来ます。
extern変数
externキーワードは変数名の宣言に静的ストレージクラスとグローバルライフタイムの識別子として使用されます。
これらの変数はプログラムの先頭から存在し、メモリはプログラムの開始直後に割り当てられ初期化されます。
複数のソースファイルで構成されたプログラムを作成することは可能です。
この場合、プリプロセッサに指示する#includeディレクティブが使用されます。
同じ型と識別子を持つexternと宣言された変数は、プロジェクト内の複数のソースファイルに存在することが出来ます。
プロジェクト全体をコンパイルする時、同じ型と識別子を持つ全てのextern変数は、グローバル変数プールのメモリの一部に関連しています。
Extern変数は、ソースファイルの分割コンパイルするのに便利です。
Extern変数が初期化出来るのは一度だけです。
同じ型と識別子を持つextern変数の複数の初期化は禁止されています。
違い
ざっくり言えばinputはプログラムによる書き換えが不可でexternは書き換えが可能という点が大きな差です。
inputは定数でexternはグローバル変数のようなイメージですね。
定数は#defineで宣言するから定数ではないですが、、、
結論
わざわざユーザーが入力している値なので、特別な理由がない限り入力パラメータを使用する際はinputの方が無難そう。
参考
・その他
外部変数・・・MT4(メタトレーダー4)のEA(自動売買)プログラミング講座
[MT4プログラミング]小ネタ inputとexternの違いやsinputのお話し