编译器指令 (F#)

本主题介绍处理器指令和编译器指令。

预处理器指令

预处理器指令带有 # 号前缀,并单独出现在一行中。 该指令由预处理器解释,预处理器将在编译器本身运行之前运行。

下表列出了 F# 中可用的预处理器指令。

指令

说明

#if 符号

支持条件编译。 如果定义了符号,则会包括 #if 后面部分中的代码。

#else

支持条件编译。 如果未定义用于前面的 #if 的符号,则将某段代码标记为包括在内。

#endif

支持条件编译。 标记条件代码段的结尾。

#[行] int, #[行] int string, #[行] int verbatim-string

指示用于调试的原始源代码行和文件名。 此功能为生成 F# 源代码的工具提供。

条件编译指令

由这些指令中的某个指令停用的代码在 Visual Studio 代码编辑器中显示为灰色。

备注

条件编译指令的行为不是与其他语言中的行为相同。例如,您不能使用包含符号的布尔表达式,并且 true 和 false 没有特殊含义。您在 #if 指令中使用的符号必须通过命令行或在项目设置中定义;没有 #define 预处理器指令。

下面的代码阐释 #if、#else 和 #endif 指令的用法。 在此示例中,代码包含两个版本的 function1 定义。 如果 VERSION1 是通过使用 -define 编译器选项定义的,则会激活 #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 指令使用的符号。

条件编译指令可以嵌套。 缩进对于预处理器指令并不重要。

行指令

在生成时,编译器将通过引用发生每个错误的行号来报告 F# 代码中的错误。 这些行号从 1(表示文件中的第一行)开始。 但是,如果您通过另一个工具生成 F# 源代码,则生成的代码中的行号通常没有意义,因为生成的 F# 代码中的错误很可能是从另一个源中引发的。 利用 #line 指令,用于生成 F# 源代码的工具的作者可以将有关原始行号和源文件的信息传递到生成的 F# 代码。

如果使用 #line 指令,则必须将文件名括在引号中。 除非字符串前面出现了原义标记 (@),否则您必须通过使用两个反斜杠字符(而不是一个)将反斜杠字符转义,以便在路径中使用这些字符。 下面是有效的行标记。 在这些示例中,已假定在通过某个工具运行原始文件 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# 文档中的语法假定您在使用轻量语法。 有关更多信息,请参见详细语法 (F#)

有关解释器 (fsi.exe) 指令,请参见 F# Interactive (fsi.exe) 参考

请参见

其他资源

F# 语言参考

编译器选项 (F#)