Поделиться через


Директивы компилятора (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

Директивы препроцессора #define в F# нет. Для определения символов, используемых в директиве #if, нужно использовать параметр компилятора или параметры проекта.

Директивы условной компиляции могут быть вложенными. Отступы для директив препроцессора несущественны.

Директивы строк

При построении компилятор сообщает об ошибках в коде F#, ссылаясь на номера строк, в которых возникают ошибки. Отсчет номеров строк начинается с 1 для первой строки в файле. Однако если исходный код F# формируется из другого средства, номера строк в сформированном коде обычно не представляют интереса, поскольку ошибки в сформированном коде F#, скорее всего, проистекают из другого источника. Директива #line дает разработчикам средств, формирующих исходный код F#, возможность передавать информацию об первоначальных номерах строк и исходных файлах в сформированный код F#.

При использовании директивы #line имена файлов нужно заключать в кавычки. Если строка не предваряется лексемой буквальности (@), символы обратной косой черты в пути нужно удваивать. Ниже показаны допустимые лексемы строк. В этих примерах предполагается, что из первоначального файла Script1 при прогоне через средство получается автоматически сформированный файл кода F#, и что код в месте расположения этих директив сформирован из некоторых лексем в строке 25 файла Script1.

# 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.

Директивы компилятора

Директивы компилятора сходны с директивами препроцессора, поскольку они снабжаются префиксом в виде знака #, однако препроцессором они не интерпретируются, а остаются компилятору — для интерпретации и выполнения соответствующих действий.

В следующей таблице приведена директива компилятора, имеющаяся в языке F#.

Директива

Описание

#light ["on"|"off"]

Включает или отключает упрощенный синтаксис для совместимости с другими версиями языка ML. По умолчанию упрощенный синтаксис включен. Подробный синтаксис всегда включен. Поэтому можно использовать как упрощенный, так и подробный синтаксис. Директива #light сама по себе равна #light "on". Если задано значение #light "off", для всех языковых конструкций необходимо использовать подробный синтаксис. Синтаксис в документации по языку F# приводится исходя из предположения, что используется упрощенный синтаксис. Дополнительные сведения см. в разделе Подробный синтаксис (F#).

Директивы интерпретатора (fsi.exe) см. в разделе Справочник по F# Interactive (fsi.exe).

См. также

Другие ресурсы

Справочник по языку F#

Параметры компилятора (F#)