FreeBASIC マニュアルのトップに戻る

FreeBASIC ProPgConditionalCompilation

目次→教本→プログラマーのための案内Conditional Compilation←オリジナル・サイト

条件付きコンパイル 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

条件付きコンパイル は、'プリ・プロセッサ・コマンド' を使って、コードの生成方法を変更できます。

'#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つの一般的な用途は、複数のインクルードに対する、ヘッダーファイルの保護です:
#ifndef AlreadyThere
#define AlreadyThere
' Text to include only once at most.
#endif
これにより、複数の #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 オプションなしでコンパイルした後の出力:
 120		

-g オプションでコンパイルした後の出力:
multiply by: 5
multiply by: 4
multiply by: 3
multiply by: 2
multiply by: 1
end of recursion and result: 120

参照
プログラマーのための案内に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2019-10-05 02:26:05
日本語翻訳:WATANABE Makoto、原文著作者:fxm

ホームページのトップに戻る

表示-非営利-継承