条件付きコンパイル は、'
プリ・プロセッサ・コマンド' を使って、コードの生成方法を変更できます。
'
#define' コマンドを使うと、コンパイル定数、つまりプログラムがコンパイルされる、プラットフォームのパラメーターを記述する定数を、定義できます。
これらの定数により、条件付きコンパイルを実行できます。
つまり、コンパイル中に定義されたパラメーターに従って、プログラムの動作を変更できます。
'
#define' コマンドは、プログラムの識別子を、他の識別子に置き換えるためにも使われます。
たとえば、プログラム全体を変更せずに、同じ関数のいくつかのバージョンをテストする場合です。
コンパイル定数
プリプロセッサの '
#define' 指示で定義されたコンパイル定数と、 '
const' キーワードで定義された定数は、明確に区別されます。
実際、リテラル定数はメモリを予約しません。
これらは、コンパイラーによって定義された、即値(直定数)です。
一方、 '
const' は、予約済みのメモリ空間を保持できます。 これは、たとえば、文字列直定数を操作する場合です。
プリプロセッサの '
#define' 指示で宣言された、リテラル定数は、常に値を保持します(再定義されていない場合)。
これらのリテラル定数には型がありません。
これは非常に迷惑であり、エラーが発生しやすいコードです。
この使用はコンパイル定数のみに予約されており、プログラムの他のすべての定数には、'
const' キーワードが優先されます。
プリプロセッサは、多数の組み込み定数を自動的に設定します。
これらは '
Intrinsic Defines' です(リストを参照)。
条件付きコンパイル
識別子とコンパイル定数の定義は、いわゆる条件付きコンパイルを実行するために、広く使われています。
条件付きコンパイルは、コンパイル定数の存在または値に応じて、ソースコードの特定の部分を、他の部分で置き換えることで構成されます。
これは、条件付きコンパイル指示を使って実現できます。
最も一般的なものはおそらく次のとおりです:
#ifdef symbol
' Conditionally included statements
#endif
#ifdef (つまり, "if defined") と
#endif の間のテキストは、識別子
symbol がプリプロセッサに認識されている場合、そのまま残されます。
それ以外の場合は、削除されます(前述の
#define コマンドを使ってだけ識別子を宣言できます)。
以下のような、他の条件付きコンパイル指示があります:
- #ifndef (if not defined ...)
- #else /
#elseif (otherwise ... / otherwise, if ...)
- #if (if ...)
#if 指示は、パラメータとして定数式を必要とします(この式が真である場合にのみ、後続のテキストが、ファイルに含まれます)。
コンパイル指示のもう1つの一般的な用途は、複数のインクルードに対する、ヘッダーファイルの保護です:
これにより、複数の
#include 呼び出しの結果として、テキストが複数回インクルードされるのを防ぎます。
実際、最初の呼び出しで、
AlreadyThere は、プリプロセッサに認識されていません。
したがって、宣言され、テキストが含まれます。
後続の呼び出しでは、
AlreadyThere が存在し、テキストは含まれません。
この種の記述はヘッダーファイルにあります。通常、ヘッダーファイルでは、複数のインクルードを行わないようにします。
例
組み込み関数(Intrinsic)定義
__FB_DEBUG__ を使って、再帰関数をデバッグする、条件付きコンパイルの例:
Function recursiveFactorial (ByVal n As Integer) As Integer
If (n = 0) Then '' end condition
#if __FB_DEBUG__ <> 0
Print "end of recursion and result:";
#endif
Return 1
Else '' recursion loop
#if __FB_DEBUG__ <> 0
Print "multiply by: " & n
#endif
Return n * recursiveFactorial(n - 1) '' recursive call
End If
End Function
Print recursiveFactorial(5)
Sleep
-g オプションなしでコンパイルした後の出力:
-g オプションでコンパイルした後の出力:
multiply by: 5
multiply by: 4
multiply by: 3
multiply by: 2
multiply by: 1
end of recursion and result: 120
参照