Dyrektywy kompilatora
W tym temacie opisano dyrektywy procesora i dyrektywy kompilatora.
Aby zapoznać się z dyrektywami F# Interactive (), zobacz Interactive Programming with F#(dotnet fsi
Programowanie interakcyjne za pomocą języka F#).
Dyrektywy preprocesora
Dyrektywa preprocesora jest poprzedzona symbolem # i jest wyświetlana w samym wierszu. Jest on interpretowany przez preprocesor, który jest uruchamiany przed samym kompilatorem.
W poniższej tabeli wymieniono dyrektywy preprocesora, które są dostępne w języku F#.
Dyrektywa | opis |
---|---|
#if symbol |
Obsługuje kompilację warunkową. Kod w sekcji po #if dołączeniu elementu , jeśli symbol jest zdefiniowany. Symbol można również negować za pomocą ! polecenia . |
#else |
Obsługuje kompilację warunkową. Oznacza sekcję kodu do uwzględnienia, jeśli symbol używany z poprzednią #if wersją nie jest zdefiniowany. |
#endif |
Obsługuje kompilację warunkową. Oznacza koniec sekcji warunkowej kodu. |
# [wiersz] int,# [wiersz] ciąg int,# [wiersz] int verbatim-string |
Wskazuje oryginalny wiersz kodu źródłowego i nazwę pliku na potrzeby debugowania. Ta funkcja jest udostępniana dla narzędzi, które generują kod źródłowy języka F#. |
#nowarn kod ostrzegawczy |
Wyłącza ostrzeżenie kompilatora lub ostrzeżenia. Aby wyłączyć ostrzeżenie, znajdź jego numer z danych wyjściowych kompilatora i uwzględnij go w cudzysłowie. Pomiń prefiks "FS". Aby wyłączyć wiele numerów ostrzeżeń w tym samym wierszu, uwzględnij każdą liczbę w cudzysłowie i oddziel każdy ciąg spacją. Na przykład: #nowarn "9" "40" . |
Efekt wyłączenia ostrzeżenia dotyczy całego pliku, w tym części pliku, które poprzedzają dyrektywę.|
Dyrektywy kompilacji warunkowej
Kod dezaktywowany przez jedną z tych dyrektyw jest wyświetlany wygaszony w Edytorze programu Visual Studio Code.
Uwaga
Zachowanie dyrektyw kompilacji warunkowej nie jest takie samo jak w innych językach. Na przykład nie można używać wyrażeń logicznych obejmujących symbole i true
false
nie mają specjalnego znaczenia. Symbole używane w if
dyrektywie muszą być zdefiniowane przez wiersz polecenia lub w ustawieniach projektu; nie define
ma dyrektywy preprocesora.
Poniższy kod ilustruje użycie #if
dyrektyw , #else
i #endif
. W tym przykładzie kod zawiera dwie wersje definicji function1
. Gdy VERSION1
jest definiowana przy użyciu opcji -define kompilatora, kod między #if
dyrektywą a dyrektywą #else
jest aktywowany. W przeciwnym razie kod między elementami #else
i #endif
jest aktywowany.
#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
W języku F#nie #define
ma dyrektywy preprocesora. Aby zdefiniować symbole używane przez dyrektywę #if
, należy użyć opcji kompilatora lub ustawień projektu.
Dyrektywy kompilacji warunkowej można zagnieżdżać. Wcięcie nie jest istotne dla dyrektyw preprocesora.
Możesz również negować symbol za pomocą !
polecenia . W tym przykładzie wartość ciągu jest czymś tylko wtedy, gdy nie jest debugowanie:
#if !DEBUG
let str = "Not debugging!"
#else
let str = "Debugging!"
#endif
Dyrektywy liniowe
Podczas kompilowania kompilator zgłasza błędy w kodzie języka F#, odwołując się do numerów wierszy, w których wystąpi każdy błąd. Te numery wierszy zaczynają się od 1 dla pierwszego wiersza w pliku. Jeśli jednak generujesz kod źródłowy języka F# z innego narzędzia, numery wierszy wygenerowanego kodu zwykle nie są interesujące, ponieważ błędy wygenerowanego kodu F# najprawdopodobniej wynikają z innego źródła. Dyrektywa #line
zapewnia autorom narzędzi, które generują kod źródłowy języka F# w celu przekazywania informacji o oryginalnych numerach wierszy i plikach źródłowych do wygenerowanego kodu F#.
W przypadku korzystania z #line
dyrektywy nazwy plików muszą być ujęte w cudzysłów. Chyba że token dosłowny (@
) pojawia się przed ciągiem, należy użyć dwóch znaków ukośnika odwrotnego zamiast jednego, aby używać ich w ścieżce. Poniżej przedstawiono prawidłowe tokeny wiersza. W tych przykładach przyjęto założenie, że oryginalny plik Script1
powoduje automatyczne wygenerowanie pliku kodu F# podczas jego uruchamiania za pomocą narzędzia i że kod w lokalizacji tych dyrektyw jest generowany na podstawie niektórych tokenów w wierszu 25 w pliku Script1
.
# 25
#line 25
#line 25 "C:\\Projects\\MyProject\\MyProject\\Script1"
#line 25 @"C:\Projects\MyProject\MyProject\Script1"
# 25 @"C:\Projects\MyProject\MyProject\Script1"
Te tokeny wskazują, że kod języka F# wygenerowany w tej lokalizacji pochodzi z niektórych konstrukcji znajdujących się w wierszu lub w pobliżu 25
.Script1