MIDP Builder2
-プリプロセッサ-
MIDP Builder2には開発の効率を上げるための機能として、ソースコードをプリプロセッサで処理をしてからビルドすることができます。
プリプロセッサで処理をしたソースファイルは、プロジェクトディレクトリ内のsrc2ディレクトリに出力されるため、編集中のソースファイルと衝突することはありません。
使用できるプリプロセッサの構文は以下の通りです。
※#includeはVer2.0.13にて追加
#if、#elif構文で使用できる演算子は以下の通りです。
#if、#elif構文では括弧"("、")"を使用して以下の記載例の様に指定することができます。
#if、#elif構文で判定できるシンボルの内、「true」 「false」は特別にJavaのboolean値と同じ扱いができます。そのため、「!true」はfalseとなります。
上記構文は、各ソースファイル内に記載することでプリプロセッサが処理を行うことになります。ただし、#define、#undefはコードが出現する前に記載しておく必要があります。
プリプロセッサで処理をしたソースファイル内の各構文の行はJavaの行コメントになります。加えて、#if、#elif、#elseの中にあるJavaコードに関しても条件に当てはまらなかった範囲は各行が行コメントになります。
このように行コメントにするため、処理後のソースと元のソースとは各記述の行番号が同じになり、デバッグをする際に便利に使えることでしょう。
各構文をコメントにしたい場合は、Javaの行コメント「//」を定義の前に記載すればコメント扱いされます。
もし、 「コメント行指定付き構文(//#)のみを有効にする」オプションが有効の場合は「//#define DEBUG」のようにJavaの行コメント(//)とセットになっている構文のみが処理されます。「//」と「#」の間に文字がある場合は処理されません。もし「//#define
DEBUG」をコメント扱いにしたい場合は「///#define DEBUG」 のように「/」を追加して「//#」の形を変更することで対応できます。
※「コメント行指定付き構文(//#)のみを有効にする」オプションはVer2.0.14にて追加
各構文は、一行に1つの構文のみ記載できます。一行に複数の構文を記載した場合や、Javaのコードと同じ行に記載した場合は構文エラーになります。
シンボルに使用できる文字は半角英数字が基本となります。
記載例:
#define DEBUG #define TEST1 #undef TEST1 #if (DEBUG && TEST1) System.out.println("DEBUG and TEST1 is defined"); #elif (!DEBUG && !TEST1) System.out.println("DEBUG and TEST1 is undefined"); #else #if TEST1 == false System.out.println("TEST1 is undefined"); #endif #endif
処理後に出力されるコード:条件に当てはまった行(太字)がコメントにならない。
//#define DEBUG //#define TEST1 //#undef TEST1 //#if (DEBUG && TEST1) // System.out.println("DEBUG and TEST1 is defined"); //#elif (!DEBUG && !TEST1) // System.out.println("DEBUG and TEST1 is undefined"); //#else // #if TEST1 == false System.out.println("TEST1 is undefined"); // #endif //#endif
標準出力された内容:
TEST1 is undefined
#ifや#elifで使用するシンボルを定義するための構文。
文字列の置き換え指定の場合は、「#define シンボル1 シンボル2」の形式で半角スペースで区切って指定します。シンボル1は元の文字列、シンボル2は置き換える文字列。(Ver2.0.2にて変更)以下の条件の場合はエラーとなります。(Ver2.0.3にて変更)
- #if、#elif、#else、#endifの内側にある場合
- 定義の後ろにコメントなどの文字列がある場合
- #defineですでに定義したシンボルを文字列置き換え#defineでシンボル指定した場合
- シンボルに半角英数以外の文字を使用した場合(置き換え時のシンボル2に関しては基本的に制約なし)
記載例:
#define debug置き換え記載例:
#define DEF_RED g.setColor( Color.RED );
※この例ではDEF_REDと記載のある個所が「g.setColor( Color.RED );」に置き換えられる。シンボル2には空白文字、タブ文字もなども使用できる。
#ifや#elifで使用するシンボルを未定義にするための構文。#defineでシンボルを定義した後に同じシンボルを指定すると未定義として扱われる。
#if、#elif、#else、#endifの内側にある場合はエラー。(Ver2.0.2にて変更)記載例:
#undef debug
シンボルが定義されているかどうかを判断するif文。 #ifは必ず#endifと対になり、この規約を守って入れば#ifの中にネストした#ifを記載することも可。括弧「()」を使用することも可。
記載例:
#define debug #if debug System.out.println("debug is defined"); #endif
Javaの「else if」を定義するための構文。#if、#endifと一緒に使用する。
記載例:
#define debug #if debug System.out.println("debug is defined"); #elif debug2 System.out.println("debug2 is defined"); #endif
Javaの「else」を定義するための構文。#if、#endif、および#elifと一緒に使用する。
記載例:
#define debug #if debug System.out.println("debug is defined"); #elif debug2 System.out.println("debug2 is defined"); #else System.out.println("debug and debug2 is undefined"); #endif
#ifと対で使用する構文。
対になる#ifが無い場合はエラー。
外部ファイルの内容と置き返す時に使用する構文。(Ver2.0.13にて追加)
#include [プリプロセス処理をしているソースコードから見た相対パス]
記載例:
#include ./test.pp