プリプロセッサ指令について

ほとんどの 前処理 は、プリプロセッサ指令で制御します。ソースコード内に指令を指定するには、 //# 文字列で始まるコメント行を作成し、その直後に指令を記述します。たとえば //#ifdef です。

XML 言語同様、プリプロセッサ指令は「 整形式 」である必要があります。すなわち、開始指令と終了指令の対である必要があります。たとえば //#if 指令のいずれかで始まるブロックは、//#endif 指令で閉じる必要があります。ブロックは入れ子にできます。つまり、if/elif/else/endif ブロック内には、追加の if/elif/else/endif ブロックをいくつでも入れることができます。

指令は、アクションと条件の定義です。プリプロセッサは、コードブロックをコメントにするか、コメント解除するかを決定します。指令式内の記号は、定義されていても、定義されていなくてもかまいません。ただし、識別子および変数には、必ず、前処理中に使用または比較可能な値が含まれている必要があります。プリプロセッサは、文字列、整数、およびブール型の 3 つの型の変数をサポートしています。

変数名は、有効な Java 識別子の開始文字/トークンと同じ文字/トークンで始まり、さらに、後続文字として「.」、「\」、および「/」を使用する必要があります。一般的な比較構文 (<=、<、>=、>、および == ) を使用して、異なる変数型を比較することができます。また、&&、||、!、および ^ などのブール演算子も使用できます。<変数名>:defined 関数または defined(<変数名>) 関数を使用して、変数の定義の有無を調べることもできます。これは、新しいコードブロックの作成時には不要であり、使用するべきでもありませんが、J2ME Polish からのインポートを容易にするために組み込まれています。詳細は、「 プリプロセッサ変数の比較 」を参照してください。

次は、elif 指令を入れ子にした If/Else ブロックの例です。

//#if mmedia 
   //#if nokia
        //#if s60_ver=="1.0"
        import com.nokia.mmapi.v1
        //#elif s60_ver=="2.0" 
        import com.nokia.mmapi.v2
       //#else
       import com.nokia.mmapi.def
       //#endif
  //#else
      import javax.microedition.mmapi
  //#endif
//#endif 
  • NetBeans IDE では Antenna プリプロセッサのすべての指令 がサポートされるため、Antenna プロジェクトを NetBeans IDE に移植した場合、プリプロセッサコードの変更は不要です。
  • 指令の構文

    次の表は、プリプロセッサ指令の解説です。

    指令
    説明
    #ifdef [識別子] 識別子は任意の型 (ブール、文字列、または整数) の変数を表し、その変数が定義されているかどうかを検査します。真 (変数が定義されている) の場合は、後続するコードが処理されます。入れ子にされたブロックも処理されます。偽 (変数が定義されていない) の場合、後続するコードはコメントにされ、入れ子にされたブロックは評価されません。この指令は、 #endif で閉じる必要があります。
    #ifndef [識別子] ifdef と同じ働きをしますが、変数が定義されていない場合に「真」を返します。この指令は、 #endif で閉じる必要があります。
    #elifdef [識別子] 標準的な else if 文のような働きをしますが、識別子が定義されているかどうかを自動的に検査します。この指令は、 ifdef/ifndef から始まるブロック内でのみ使用できます。
    #elifndef [識別子] 標準的な else if 文のような働きをしますが、識別子が定義されていないかどうかを自動的に検査します。この指令は、 ifdef/ifndef から始まるブロック内でのみ使用できます。
    #if [式] 渡された式を評価し、適切なアクションを開始します。この指令は、 #endif で閉じる必要があります。
    #elif [式] 標準的な else if文のような働きをし、if 文から始まるブロック内でのみ使用できます。この指令は、式の結果に基づいて、後続コードを前処理します。
    #else 標準的な else 文のような働きをし、定義ブロック内の先行する条件がいずれも真でなかった場合にのみ、後続するコードを前処理します。if/ifdef/ifndef 指令から始まるブロック内でのみ使用されます。
    #endif この指令は、 if/ifdef/ifndef から始まるブロックを閉じるために使用します。
    #condition [式] ファイルの先頭行に指定する必要があります。この指令は、式の結果に基づいて、ファイルを構築に含めるかどうかを決定します。
    #debug [レベル] プロジェクトプロパティーの 「コンパイル」ページ で設定されたデバッグレベルに基づいて、指令に後続する 1 行をコメントにするか、コメント解除するかを決定します。デバッグレベルが省略され、プロジェクトプロパティーでデバッグレベルが「オフ」に設定されていない場合、プリプロセッサは問題の行を自動的にデバッグします。System.out.println などの式を使用したデバッグに使用します。この指令も入れ子にできます。
    #mdebug [レベル] #debug と同じ働きをしますが、指令の次の行から #enddebug までのブロック全体をコメントにするか、コメント解除します。この指令は、 System.out.println などの式を使用したデバッグに使用します。この指令も入れ子にできます。mdebug ブロックが if/ifdef/ifndef ブロックと一部交差している場合 (閉じた if ブロック内で mdebug が呼び出され、そのブロック外に enddebug があるなど)、プリプロセッサはエラーを生成します。
    #enddebug #mdebug ブロックは、この指令で終了する必要があります。
    #define [識別子] #define [識別子=値] #define [識別子 値] プリプロセッサメモリーに、アビリティーまたは変数を一時的に追加します。入れ子にされたブロック内では使用できません。この一時変数よりも、プロジェクトの構成プロパティーで定義されている大域変数が優先されます。
    #undefine [識別子] メモリーから、一時的なアビリティーまたは変数を削除します。この宣言を使用して、プロジェクトの構成プロパティーに定義されている大域変数をプリプロセッサメモリーから削除することもできます。ただし、メモリーから削除した変数が、プロジェクト変数や構成変数のリストから削除されるわけではありません。
    関連項目
    MIDP プロジェクト構成について
    アビリティについて
    前処理について
    MIDP プロジェクト構成の作業手順
    プリプロセッサブロックの管理
    プリプロセッサ指令における比較構文

    著作権と商標について