共用方式為


編譯器指示詞

本主題描述處理器指示詞和編譯器指示詞。

如需 F# 互動 (dotnet fsi) 指示詞,請參閱 F# 互動式程式設計

前置處理器指示詞

前置處理器指示詞的字首會加上 # 符號,且自身會出現在一行中。 它是由前置處理器解譯,會在編譯器本身之前執行。

下表列出 F# 中可用的前置處理器指示詞。

指示詞 描述
#if 符號 支援條件式編譯。 如果定義 #if,則會在此「符號」後面的區段中加入程式碼。 您也可以使用 ! 來否定符號。
#else 支援條件式編譯。 若未定義與先前的 #if 搭配使用的符號,則標記要包含的程式碼區段。
#endif 支援條件式編譯。 標示程式碼的條件式區段結尾。
#[line] int,
#[line] intstring,
#[line] intverbatim-string
表示原始的原始程式碼行和檔案名稱 (適用於偵錯)。 這項功能提供用於產生 F# 原始程式碼的工具。
#nowarnwarningcode 停用編譯器警告。 若要停用警告,請從編譯器輸出中找出其號碼並包含在引號中。 略過 "FS" 前置詞。 若要停用同一行的多個警告號碼,請以引號括住每個號碼,並以一個空格分隔每個字串。
例如:#nowarn "9" "40"

停用警告的效果適用於整個檔案,包括指示詞前面的檔案部分。

條件式編譯指示詞

由上述其中一個指示詞停用的程式碼會在 Visual Studio 程式碼編輯器中顯示為停用。

注意

條件式編譯指示詞的行為與其在其他語言的行為不同。 例如,您無法使用包含符號的布林運算式,且 truefalse 沒有特殊意義。 在 if 指示詞中使用的符號必須透過命令列定義,或在專案設定中定義;沒有任何 define 前置處理器指示詞。

下列程式碼說明如何使用 #if#else#endif 指示詞。 在此範例中,程式碼包含兩個版本的 function1 定義。 使用 -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 指示詞所使用的符號。

條件式編譯指示詞可以巢狀化。 縮排對於前置處理器指示詞而言不重要。

您也可以使用 ! 來否定符號。 在此範例中,字串的值只能是「不」偵錯時的某個值:

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

行指示詞

建置時,編譯器會參考發生的每個錯誤所在的行號,以報告 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# 程式碼,是衍生自 Script125 行或附近的某些建構。

另請參閱