コンパイラ ディレクティブ

このトピックでは、プロセッサ ディレクティブとコンパイラ ディレクティブについて説明します。

プリプロセッサ ディレクティブ

プリプロセッサ ディレクティブは、# シンボルで始まり、独立した行に記述されます。 プリプロセッサ ディレクティブは、コンパイラ自体の前に実行されるプリプロセッサにより解釈されます。

次の表に、F# で使用できるプリプロセッサ ディレクティブの一覧を示します。

ディレクティブ 説明
#if symbol 条件付きコンパイルをサポートします。 symbol が定義されている場合、#if の後ろのセクションのコードが含まれます。 symbol は ! で否定することもできます。
#else 条件付きコンパイルをサポートします。 前の #if で使用したシンボルが定義されていない場合に含めるコードのセクションをマークします。
#endif 条件付きコンパイルをサポートします。 コードの条件付きセクションの末尾をマークします。
#[line] int
#[line] int string
#[line] int verbatim-string
デバッグ用に、元のソース コードの行とファイル名を示します。 この機能は、F# ソース コードを生成するツール用に用意されています。
#nowarn warningcode コンパイラ警告を無効にします。 警告を無効にするには、コンパイラ出力で警告の番号を確認し、その番号を引用符で囲んで指定します。 "FS" プレフィックスを省略します。 1 つの行で複数の警告番号を無効にするには、それぞれの番号を引用符で囲んだうえで各文字列をスペースで区切ります。 次に例を示します。

#nowarn "9" "40"

警告を無効にした場合、ファイル内でそのディレクティブの前にある部分を含めて、ファイル全体にその影響が及びます。

条件付きコンパイル ディレクティブ

これらのディレクティブのいずれかによって非アクティブにされたコードは、Visual Studio Code エディターで淡色表示になります。

注意

条件付きコンパイル ディレクティブの動作は、他の言語と同じではありません。 たとえば、シンボルを含むブール式を使用することはできません。また、true および false には特別な意味はありません。 if ディレクティブで使用するシンボルは、コマンド ラインまたはプロジェクト設定で定義する必要があります。define プリプロセッサ ディレクティブは存在しません。

次のコードは、#if ディレクティブ、#else ディレクティブ、および #endif ディレクティブの使用例を示しています。 この例では、function1 の定義の 2 つのバージョンがコードに含まれています。 -define コンパイラ オプションを使用して VERSION1 を定義した場合、#if ディレクティブと #else ディレクティブの間にあるコードがアクティブになります。 それ以外の場合、#else#endif の間にあるコードがアクティブになります。

#if VERSION1
let function1 x y =
   printfn "x: %d y: %d" x y
   x + 2 * y
#else
let function1 x y =
   printfn "x: %d y: %d" x y
   x - 2*y
#endif

let result = function1 10 20

F# には、#define プリプロセッサ ディレクティブはありません。 #if ディレクティブで使用するシンボルを定義するには、コンパイラ オプションまたはプロジェクト設定を使用する必要があります。

条件付きコンパイル ディレクティブは、入れ子にすることができます。 プリプロセッサ ディレクティブでは、インデントに意味はありません。

symbol は ! で否定することもできます。 この例では、文字列の値は、デバッグして "いない" ときだけ、何かになります。

#if !DEBUG
let str = "Not debugging!"
#else
let str = "Debugging!"
#endif

行ディレクティブ

ビルド時にコンパイラは、各エラーが発生した行番号を参照して、F# コード内のエラーを報告します。 これらの行番号は、ファイル内の最初の行から 1 で始まります。 ただし、別のツールから F# ソース コードを生成している場合、生成されたコードの行番号は、通常、重要ではありません。これは、生成された F# コード内のエラーは、別のソースから発生する可能性が高いためです。 #line ディレクティブを使用すると、F# ソース コードを生成するツールの作成者が、元の行番号およびソース ファイルに関する情報を、生成された F# コードに渡すことができます。

#line ディレクティブを使用する場合、ファイル名を引用符で囲む必要があります。 パスでバックスラッシュ文字を使用するには、文字列の前に逐語的トークン (@) がある場合を除き、バックスラッシュ文字をエスケープする必要があります。エスケープするには、バックスラッシュ文字を 1 つではなく、2 つ使用します。 有効な行トークンを次に示します。 これらの例では、ツールを使用して元のファイル Script1 を実行したときに F# コード ファイルが自動生成され、これらのディレクティブがある位置のコードが Script1 ファイルの 25 行目のトークンから生成されるものと仮定します。

# 25
#line 25
#line 25 "C:\\Projects\\MyProject\\MyProject\\Script1"
#line 25 @"C:\Projects\MyProject\MyProject\Script1"
# 25 @"C:\Projects\MyProject\MyProject\Script1"

これらのトークンは、この場所で生成された F# コードが、Script1 内の行 25 またはその近くにあるなんらかの構成要素から派生したことを示します。

コンパイラ ディレクティブ

コンパイラ ディレクティブは、# 記号で始まるという点でプリプロセッサ ディレクティブに似ていますが、プリプロセッサが解釈するのではなく、コンパイラが解釈して対応できるように放置されます。

次の表に、F# で使用できるコンパイラ ディレクティブの一覧を示します。

ディレクティブ 説明
#light ["on"|"off"] 他のバージョンの ML との互換性を保つために、軽量構文を有効または無効にします。 既定では、軽量構文は有効です。 冗語構文は常に有効です。 したがって、軽量構文と冗語構文の両方を使用できます。 ディレクティブ #light#light "on" と同等です。 #light "off" を指定した場合は、すべての言語構成要素に冗語構文を使用する必要があります。 F# のドキュメント内の構文は、軽量構文の使用を前提として記述されています。 詳細については、「冗語構文」を参照してください。

インタープリター (fsi.exe) ディレクティブについては、「F# による対話型プログラミング」を参照してください。

関連項目