Diretivas de compilador

Este tópico descreve diretivas de processador e diretivas de compilador.

Para diretivas F# interativas (dotnet fsi), consulte Programação interativa com F#.

Diretivas de pré-processador

Uma diretiva de pré-processador é prefixada com o símbolo # e aparece em uma linha sozinha. Ela é interpretada pelo pré-processador, que é executado antes do próprio compilador.

A tabela a seguir lista as diretivas de pré-processador disponíveis no F#.

Diretiva Descrição
#ifsimbolo Suporte à compilação condicional. O código na seção após o #if é incluído se o símbolo estiver definido. O símbolo também pode ser negado com !.
#else Suporte à compilação condicional. Marca uma seção de código a ser incluída se o símbolo usado com o #if anterior não estiver definido.
#endif Suporte à compilação condicional. Marca o final de uma seção condicional do código.
#[line] int,
#[line] intstring,
#[line] intverbatim-string
Indica a linha de código-fonte original e o nome do arquivo, para depuração. Esse recurso é fornecido para ferramentas que geram código-fonte em F#.
#nowarnwarningcode Desabilita um aviso ou avisos do compilador. Para desabilitar um aviso, localize seu número na saída do compilador e inclua-o entre aspas. Omita o prefixo "FS". Para desabilitar vários números de aviso na mesma linha, inclua cada número entre aspas e separe cada cadeia de caracteres por um espaço.
Por exemplo: #nowarn "9" "40"

O efeito de desabilitar um aviso se aplica ao arquivo inteiro, incluindo partes do arquivo que precedem a diretiva.|

Diretivas de compilação condicional

O código desativado por uma dessas diretivas aparece esmaecido no Visual Studio Code Editor.

Observação

O comportamento das diretivas de compilação condicional não é o mesmo que em outras linguagens. Por exemplo, você não pode usar expressões booleanas envolvendo símbolos, e true e false não têm significado especial. Os símbolos que você usa na diretiva if devem ser definidos pela linha de comando ou nas configurações do projeto; não há diretiva de pré-processador define.

O código a seguir ilustra o uso das diretivas #if, #else e #endif. Neste exemplo, o código contém duas versões da definição de function1. Quando VERSION1 é definido usando a opção -define do compilador, o código entre a diretiva #if e a diretiva #else é ativado. Caso contrário, o código entre #else e #endif é ativado.

#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

Não há diretiva de pré-processador #define em F#. Você deve usar a opção do compilador ou as configurações do projeto para definir os símbolos usados pela diretiva #if.

As diretivas de compilação condicional podem ser aninhadas. O recuo não é significativo para diretivas de pré-processador.

Você também pode negar um símbolo com !. Neste exemplo, o valor de uma cadeia de caracteres é algo somente quando não estiver depurando:

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

Diretivas de linha

Ao compilar, o compilador relata erros no código F# referenciando os números de linha em que cada erro ocorre. Esses números de linha começam em 1 para a primeira linha em um arquivo. No entanto, se você estiver gerando código-fonte F# de outra ferramenta, os números de linha no código gerado geralmente não são de interesse, porque os erros no código F# gerado provavelmente surgem de outra fonte. A diretiva #line fornece uma maneira para os autores de ferramentas que geram código-fonte F# passarem informações sobre os números de linha originais e os arquivos-fonte para o código F# gerado.

Ao usar a diretiva #line, os nomes dos arquivos devem ser colocados entre aspas. A menos que o token literal (@) apareça na frente da cadeia de caracteres, você deve escapar caracteres de barra invertida usando dois caracteres de barra invertida em vez de um para usá-los no caminho. A seguir estão os tokens de linha válidos. Nestes exemplos, suponha que o arquivo original Script1 resulte em um arquivo de código F# gerado automaticamente quando executado por meio de uma ferramenta e que o código no local dessas diretivas seja gerado a partir de alguns tokens na linha 25 do arquivo Script1.

# 25
#line 25
#line 25 "C:\\Projects\\MyProject\\MyProject\\Script1"
#line 25 @"C:\Projects\MyProject\MyProject\Script1"
# 25 @"C:\Projects\MyProject\MyProject\Script1"

Esses tokens indicam que o código F# gerado neste local é derivado de algumas construções na ou próximo à linha 25 em Script1.

Confira também