編譯器指示詞
本主題描述處理器指示詞和編譯器指示詞。
如需 F# 互動 (dotnet fsi
) 指示詞,請參閱 F# 互動式程式設計。
前置處理器指示詞
前置處理器指示詞的字首會加上 # 符號,且自身會出現在一行中。 它是由前置處理器解譯,會在編譯器本身之前執行。
下表列出 F# 中可用的前置處理器指示詞。
指示詞 | 描述 |
---|---|
#if
象徵 |
支援條件式編譯。 如果定義 #if ,則會在此「符號」後面的區段中加入程式碼。 您也可以使用 ! 來否定符號。 |
#else |
支援條件式編譯。 若未定義與先前的 #if 搭配使用的符號,則標記要包含的程式碼區段。 |
#endif |
支援條件式編譯。 標示程式碼的條件式區段結尾。 |
# [line] int,# [line] intstring,# [line] int逐字字串 |
表示原始的原始程式碼行和檔案名稱 (適用於偵錯)。 這項功能提供用於產生 F# 原始程式碼的工具。 |
#nowarn
warningcode |
停用編譯器警告。 若要停用相同行上的多個警告編號,請以空格分隔每個字串。 例如: #nowarn 9 42 |
停用警告的效果適用於整個檔案,包括指示詞前面的檔案部分。
條件式編譯指示詞
由上述其中一個指示詞停用的程式碼會在 Visual Studio 程式碼編輯器中顯示為停用。
注意
條件式編譯指示詞的行為與其在其他語言的行為不同。 例如,您無法使用包含符號的布林運算式,且 true
和 false
沒有特殊意義。 在 if
指示詞中使用的符號必須透過命令列定義,或在專案設定中定義;沒有任何 define
前置處理器指示詞。
下列程式碼說明如何使用 #if
、#else
和 #endif
指示詞。 在此範例中,程式碼包含兩個版本的 function1
定義。 使用 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# 程式碼,是衍生自 25
的 Script1
行或附近的某些建構。