0

プリプロセッサの条件付きコンパイル ディレクティブを使用している次のコードがあります。

#define foo
#define bar

#ifdef foo || !bar
  extern bool Verbose = FALSE;
#else
  extern bool Verbose = TRUE;
#endif

void start() {
}

次のエラーのため、コンパイルされません。

test.mq4(3,12) : エラー 175: ' ||' - グローバル スコープでは式を使用できません

ただし、最初の行(foo)がコメントアウトされている場合、コードは正常にコンパイルされます。その場合(fooが定義されていない場合)、コンパイラはグローバルスコープでこの式を許可しているようです。

コンパイラを使用して上記のコードをmqlコンパイルしてみることができます(Linux で使用wine):

mql.exe /mql4 test.mq4

質問は次のとおりです。


なぜこれが機能しないのですか? また、上記のプリプロセッサ条件 ( )を適切な方法で
定義するにはどうすればよいですか?foo || !bar


次の構文も試しました。

#if defined (foo) || defined (!bar)

user2357112 ( GNU cpp syntax )によって以前に提案されたように、次のエラーで失敗します。

エラー 109: ' #if' - プリプロセッサ コマンドが無効です

エラー 149: ' #else' - 予期しないトークン

これは、MQL 構文が完全に異なり、これらの種類のプリプロセッサ コマンドをサポートしていないためです。

4

1 に答える 1

3

なぜこれが機能しないのですか?

条件
構文が MQL4preprocessor の仕様を満たしていないためです(むしろもう一度セクションをチェックしてクロスチェックしました: [リファレンス / 言語の基本 / プリプロセッサ / 条件付きコンパイル ( ) ] )
MQL4 Documentation

MQL4#ifdef#ifndef#else#endif


プリプロセッサの条件付きコンパイル ディレクティブを使用すると、特定の条件が満たされるかどうかに応じて、プログラムの一部をコンパイルまたはスキップできます。

その条件 canは、次のいずれかの形式を取ります。 // ... ここにあるコードがコンパイルされ ます。 // ... #define ディレクティブでプリプロセッサ用に既に定義されている場合。 // ... ここにあるコードがコンパイルされます// ...が現在プリプロセッサ#define ディレクティブによって定義されていない場合。

#ifdef identifier

identifier
#endif

#ifndef identifier

identifier
#endif

Aconditionは、この MQL4 プリプロセッサ コンテキストでは、認識された構文ディレクティブ コンストラクターの静的で閉じたセットのメンバーです。{ #ifdef | #ifndef | #else }

Anidentifierは、この MQL4 プリプロセッサ コンテキストでは、定数termあり、式ではありません。

Q.E.D.


適切な方法?

不足しているロジックの柔軟性を「手動で」構築することを選択する場合もあります。

#ifdef bar_identifier
    #ifndef foo_indentifier
         extern bool aCompileTimePresetDefaultToExposedEXTERN_USER_INPUT = True;
    #else
         extern bool aCompileTimePresetDefaultToExposedEXTERN_USER_INPUT = False;
    #endif
#else
         extern bool aCompileTimePresetDefaultToExposedEXTERN_USER_INPUT = False;
#endif
于 2015-10-10T10:26:29.930 に答える