Udostępnij za pośrednictwem


Dyrektywy kompilatora

W tym temacie opisano dyrektywy procesora i dyrektywy kompilatora.

Aby zapoznać się z dyrektywami F# Interactive (), zobacz Interactive Programming with F#(dotnet fsiProgramowanie 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
#ifsymbol 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#.
#nowarnkod 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 #ifdyrektyw , #elsei #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

Zobacz też