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

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

F# インタラクティブ (dotnet fsi) ディレクティブについては、F# を使用した対話型のプログラミングに関するページを参照してください。

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

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

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

ディレクティブ 説明
#ifsymbol 条件付きコンパイルをサポートします。 symbol が定義されている場合、#if の後ろのセクションのコードが含まれます。 symbol は ! で否定することもできます。
#else 条件付きコンパイルをサポートします。 前の #if で使用したシンボルが定義されていない場合に含めるコードのセクションをマークします。
#endif 条件付きコンパイルをサポートします。 コードの条件付きセクションの末尾をマークします。
#[line] int
#[line] intstring,
#[line] intverbatim-string
デバッグ用に、元のソース コードの行とファイル名を示します。 この機能は、F# ソース コードを生成するツール用に用意されています。
#nowarnwarningcode コンパイラ警告を無効にします。 警告を無効にするには、コンパイラ出力で警告の番号を確認し、その番号を引用符で囲んで指定します。 "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 またはその近くにあるなんらかの構成要素から派生したことを示します。

関連項目