Directivas de compilador

En este tema se describen las directivas de procesador y las directivas de compilador.

Para conocer las directivas de F# interactivo (dotnet fsi), consulte Programación interactiva con F#.

Directivas de preprocesador

Una directiva de preprocesador tiene como prefijo el símbolo # y aparece en una línea independiente. La interpreta el preprocesador, que se ejecuta antes que el compilador.

En la siguiente tabla se recoge una lista de las directivas de preprocesador disponibles en F#.

Directiva Descripción
#ifsymbol Admite la compilación condicional. Se incluye el código de la sección tras #if si symbol se ha definido. El símbolo también se puede negar con !.
#else Admite la compilación condicional. Marca una sección de código que incluir si el símbolo usado con la directiva #if anterior no se ha definido.
#endif Admite la compilación condicional. Marca el final de una sección condicional de código.
#[line] int,
#[line] intstring,
#[line] intverbatim-string
Indica el nombre de archivo y la línea de código fuente original para la depuración. Esta característica se proporciona para las herramientas que generan código fuente de F#.
#nowarnwarningcode Deshabilita una o varias advertencias del compilador. Para deshabilitar una advertencia, encuentre su número correspondiente en los resultados del compilador e inclúyalo entre comillas. Omita el prefijo "FS". Para deshabilitar varios números de advertencia en la misma línea, incluya cada número entre comillas y separe cada cadena con un espacio.
Por ejemplo: #nowarn "9" "40"

El efecto de deshabilitar una advertencia se aplica a todo el archivo, incluidas las partes del archivo que preceden a la directiva.

Directivas de compilación condicional

El código que se desactiva mediante una de estas directivas aparece atenuado en el editor de Visual Studio Code.

Nota

El comportamiento de las directivas de compilación condicional no es el mismo que en otros idiomas. Así, no se pueden usar expresiones booleanas con símbolos, mientras que true y false no tienen ningún significado especial. Los símbolos que se usan en la directiva if se tienen que definir con la línea de comandos o en la configuración del proyecto; no hay ninguna directiva de preprocesador define.

El siguiente código muestra el uso de las directivas #if, #else y #endif. En este ejemplo, el código contiene dos versiones de la definición de function1. Cuando VERSION1 se define mediante la opción de compilador -define, se activa el código entre la directiva #if y la directiva #else. De lo contrario, se activará el código entre #else y #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

No hay ninguna directiva de preprocesador #define en F#. Hay que usar la configuración del proyecto o la opción del compilador pertinente para definir los símbolos que la directiva #if usa.

Las directivas de compilación condicional se pueden anidar. La sangría no es significativa en las directivas de preprocesador.

También se puede negar un símbolo con !. En este ejemplo, el valor de una cadena es pertinente solo cuando no se está depurando:

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

Directivas de línea

Al compilar, el compilador informa de los posibles errores en el código de F# haciendo referencia a los números de línea en los que cada error se produce. Estos números de línea empiezan por 1 en la primera línea en un archivo. Pero si genera código fuente de F# con otra herramienta, los números de línea en el código generado no suelen ser de interés, ya que lo más probable es que los errores en el código de F# generado provengan de otro código fuente. La directiva #line constituye una forma de que los creadores de herramientas que generan código fuente de F# pasen información sobre los archivos de origen y los números de línea originales al código de F# generado.

Cuando se usa la directiva #line, es necesario que los nombres de archivo estén entre comillas. A menos que el token textual (@) aparezca delante de la cadena, hay que anteponer caracteres de barra diagonal inversa usando dos caracteres de barra diagonal inversa en lugar de uno, ya que así se podrán usar en la ruta de acceso. Los siguientes tokens de línea son válidos. En estos ejemplos, se da por hecho que el archivo original Script1 da como resultado un archivo de código de F# generado automáticamente cuando se ejecuta con una herramienta y, asimismo, que el código en la ubicación de estas directivas se genera a partir de determinados tokens en la línea 25 del archivo Script1.

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

Estos tokens indican que el código de F# generado en esta ubicación se deriva de algunas construcciones en la línea 25 en Script1, o cerca de ella.

Vea también