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

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

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

プリプロセッサ ディレクティブは、# シンボルで始まり、独立した行に記述されます。A preprocessor directive is prefixed with the # symbol and appears on a line by itself. プリプロセッサ ディレクティブは、コンパイラ自体の前に実行されるプリプロセッサにより解釈されます。It is interpreted by the preprocessor, which runs before the compiler itself.

次の表に、F# で使用できるプリプロセッサ ディレクティブの一覧を示します。The following table lists the preprocessor directives that are available in F#.

ディレクティブDirective 説明Description
#ifシンボル#if symbol 条件付きコンパイルをサポートします。Supports conditional compilation. シンボルが定義されている場合、の後にあるセクションのコードが #if 含まれます。 symbolCode in the section after the #if is included if the symbol is defined. 記号は、で否定することもでき ! ます。The symbol can also be negated with !.
#else 条件付きコンパイルをサポートします。Supports conditional compilation. 前の #if で使用したシンボルが定義されていない場合に含めるコードのセクションをマークします。Marks a section of code to include if the symbol used with the previous #if is not defined.
#endif 条件付きコンパイルをサポートします。Supports conditional compilation. コードの条件付きセクションの末尾をマークします。Marks the end of a conditional section of code.
#直線 int#[line] int,
#直線 int 文字列#[line] int string,
#直線 int 逐語的文字列#[line] int verbatim-string
デバッグ用に、元のソース コードの行とファイル名を示します。Indicates the original source code line and file name, for debugging. この機能は、F# ソース コードを生成するツール用に用意されています。This feature is provided for tools that generate F# source code.
#nowarn警告コード#nowarn warningcode コンパイラ警告を無効にします。Disables a compiler warning or warnings. 警告を無効にするには、コンパイラ出力で警告の番号を確認し、その番号を引用符で囲んで指定します。To disable a warning, find its number from the compiler output and include it in quotation marks. "FS" プレフィックスを省略します。Omit the "FS" prefix. 1 つの行で複数の警告番号を無効にするには、それぞれの番号を引用符で囲んだうえで各文字列をスペースで区切ります。To disable multiple warning numbers on the same line, include each number in quotation marks, and separate each string by a space. 次に例を示します。For example:

#nowarn "9" "40"

警告を無効にした場合の影響は、ファイル全体 (ディレクティブの前にあるファイルの部分を含む) に適用されます |。The effect of disabling a warning applies to the entire file, including portions of the file that precede the directive.|

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

これらのディレクティブのいずれかによって非アクティブ化されたコードは、Visual Studio Code エディターでは淡色表示になります。Code that is deactivated by one of these directives appears dimmed in the Visual Studio Code Editor.

注意

条件付きコンパイル ディレクティブの動作は、他の言語と同じではありません。The behavior of the conditional compilation directives is not the same as it is in other languages. たとえば、シンボルを含むブール式を使用することはできません。また、true および false には特別な意味はありません。For example, you cannot use Boolean expressions involving symbols, and true and false have no special meaning. if ディレクティブで使用するシンボルは、コマンド ラインまたはプロジェクト設定で定義する必要があります。define プリプロセッサ ディレクティブは存在しません。Symbols that you use in the if directive must be defined by the command line or in the project settings; there is no define preprocessor directive.

次のコードは、#if ディレクティブ、#else ディレクティブ、および #endif ディレクティブの使用例を示しています。The following code illustrates the use of the #if, #else, and #endif directives. この例では、function1 の定義の 2 つのバージョンがコードに含まれています。In this example, the code contains two versions of the definition of function1. VERSION1 -Define コンパイラオプションを使用してを定義すると、ディレクティブとディレクティブの間のコード #if #else がアクティブ化されます。When VERSION1 is defined by using the -define compiler option, the code between the #if directive and the #else directive is activated. それ以外の場合、#else#endif の間にあるコードがアクティブになります。Otherwise, the code between #else and #endif is activated.

#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 プリプロセッサ ディレクティブはありません。There is no #define preprocessor directive in F#. #if ディレクティブで使用するシンボルを定義するには、コンパイラ オプションまたはプロジェクト設定を使用する必要があります。You must use the compiler option or project settings to define the symbols used by the #if directive.

条件付きコンパイル ディレクティブは、入れ子にすることができます。Conditional compilation directives can be nested. プリプロセッサ ディレクティブでは、インデントに意味はありません。Indentation is not significant for preprocessor directives.

また、シンボルをで反転させることもでき ! ます。You can also negate a symbol with !. この例では、文字列の値は、デバッグ されていない 場合にのみ使用されます。In this example, a string's value is something only when not debugging:

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

行ディレクティブLine Directives

ビルド時にコンパイラは、各エラーが発生した行番号を参照して、F# コード内のエラーを報告します。When building, the compiler reports errors in F# code by referencing line numbers on which each error occurs. これらの行番号は、ファイル内の最初の行から 1 で始まります。These line numbers start at 1 for the first line in a file. ただし、別のツールから F# ソース コードを生成している場合、生成されたコードの行番号は、通常、重要ではありません。これは、生成された F# コード内のエラーは、別のソースから発生する可能性が高いためです。However, if you are generating F# source code from another tool, the line numbers in the generated code are generally not of interest, because the errors in the generated F# code most likely arise from another source. #line ディレクティブを使用すると、F# ソース コードを生成するツールの作成者が、元の行番号およびソース ファイルに関する情報を、生成された F# コードに渡すことができます。The #line directive provides a way for authors of tools that generate F# source code to pass information about the original line numbers and source files to the generated F# code.

#line ディレクティブを使用する場合、ファイル名を引用符で囲む必要があります。When you use the #line directive, file names must be enclosed in quotation marks. パスでバックスラッシュ文字を使用するには、文字列の前に逐語的トークン (@) がある場合を除き、バックスラッシュ文字をエスケープする必要があります。エスケープするには、バックスラッシュ文字を 1 つではなく、2 つ使用します。Unless the verbatim token (@) appears in front of the string, you must escape backslash characters by using two backslash characters instead of one in order to use them in the path. 有効な行トークンを次に示します。The following are valid line tokens. これらの例では、ツールを使用して元のファイル Script1 を実行したときに F# コード ファイルが自動生成され、これらのディレクティブがある位置のコードが Script1 ファイルの 25 行目のトークンから生成されるものと仮定します。In these examples, assume that the original file Script1 results in an automatically generated F# code file when it is run through a tool, and that the code at the location of these directives is generated from some tokens at line 25 in file Script1.

# 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 またはその近くにあるなんらかの構成要素から派生したことを示します。These tokens indicate that the F# code generated at this location is derived from some constructs at or near line 25 in Script1.

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

コンパイラ ディレクティブは、# 記号で始まるという点でプリプロセッサ ディレクティブに似ていますが、プリプロセッサが解釈するのではなく、コンパイラが解釈して対応できるように放置されます。Compiler directives resemble preprocessor directives, because they are prefixed with a # sign, but instead of being interpreted by the preprocessor, they are left for the compiler to interpret and act on.

次の表に、F# で使用できるコンパイラ ディレクティブの一覧を示します。The following table lists the compiler directive that is available in F#.

ディレクティブDirective 説明Description
#light ["on" | "off"]#light ["on"|"off"] 他のバージョンの ML との互換性を保つために、軽量構文を有効または無効にします。Enables or disables lightweight syntax, for compatibility with other versions of ML. 既定では、軽量構文は有効です。By default, lightweight syntax is enabled. 冗語構文は常に有効です。Verbose syntax is always enabled. したがって、軽量構文と冗語構文の両方を使用できます。Therefore, you can use both lightweight syntax and verbose syntax. ディレクティブ #light#light "on" と同等です。The directive #light by itself is equivalent to #light "on". #light "off" を指定した場合は、すべての言語構成要素に冗語構文を使用する必要があります。If you specify #light "off", you must use verbose syntax for all language constructs. F# のドキュメント内の構文は、軽量構文の使用を前提として記述されています。Syntax in the documentation for F# is presented with the assumption that you are using lightweight syntax. 詳細については、「 Verbose 構文」を参照してください。For more information, see Verbose Syntax.

インタープリター (fsi.exe) のディレクティブについては、「 F # を使用した対話型プログラミング」を参照してください。For interpreter (fsi.exe) directives, see Interactive Programming with F#.

関連項目See also