externがもともとあり、あとからinputが追加されたようです。
この二つの違いはなんでしょう?私のプログラムでも古いものはextern、最近はinputを使用しています。
この辺りはMT4/5も変わらずと思い、日本語になっているMQL5.comからの引用してみます。
input
https://www.mql5.com/ja/docs/basis/variables/inputvariables
input ストレージクラスは、外部変数を定義しています。input 修飾子は、データ型の前に示されます。input 修飾子を持つ変数はMQL5 プログラム内で変更することはできず、読み取り専用でアクセスすることが出来ます。input 変数の値はプログラムのプロパティウィンドウから、ユーザによってのみ変更することが出来ます。
extern
https://www.mql5.com/ja/docs/basis/variables/externvariables
extern キーワードは変数名の宣言に静的ストレージクラスとグローバルライフタイムの識別子として使用されます。これらの変数はプログラムの先頭から存在し、メモリはプログラムの開始直後に割り当てられ初期化されます。
複数のソースファイルで構成されたプログラムを作成することは可能です。この場合、プリプロセッサに指示する #include ディレクティブが使用されます。同じ型と識別子を持つ extern と宣言された変数は、プロジェクト内の複数のソースファイルに存在することが出来ます。
うん。全然違う説明ですね。C言語的にはextern宣言は、グローバル宣言で、すべてのソースコードから共通で使用できる変数として宣言されます。プログラマ的には基本使っちゃダメ的な奴です。
MT4ではユーザ入力変数としてextern宣言を使用していたのを、言語仕様を整理する際、辻褄があってないので、inputを別に作ったという感じでしょうか?
input宣言の特徴としてはプログラム内からは値の変更ができない定数のように扱われることです。C#やJavaでいうところのfinal宣言みたいな感じですね。
値を変更しようとすると、コンパイルエラーとなります。
ユーザ入力変数としては、プログラムから値の書き換えが発生しないほうがわかりやすいと思いますので、やはりinputを使うのが正しい形なのかと思います。
ちなみに、sinputという宣言があり、なんぞ?と思いましたが、これはEAにて最適化対象外とするための宣言のようです。例えばマジックナンバーなどは最適化する必要がないため
sinput int MagicNumber = 123456789; // マジックナンバー
と宣言すると、
このように、EAテスターのエキスパート設定内からのパラメータ入力において、最適化対象のチェックボックスが無効化されます。
知りませんでした・・・^^;;;;
今作っているやつもちゃんと対応しないとですね。
ブログランキングにご協力よろしくお願いいたしますm(_ _ )m
にほんブログ村