Programación D - Compilación condicional
La compilación condicional es el proceso de seleccionar qué código compilar y qué código no compilar de manera similar a #if / #else / #endif en C y C ++. Cualquier declaración que no esté compilada debe ser sintácticamente correcta.
La compilación condicional implica verificaciones de condición que se pueden evaluar en el momento de la compilación. Las declaraciones condicionales en tiempo de ejecución como if, for, while no son características de compilación condicional. Las siguientes características de D están destinadas a la compilación condicional:
- debug
- version
- estático si
Declaración de depuración en D
La depuración es útil durante el desarrollo del programa. Las expresiones y sentencias que están marcadas como debug se compilan en el programa solo cuando el modificador de compilador -debug está habilitado.
debug a_conditionally_compiled_expression;
debug {
// ... conditionally compiled code ...
} else {
// ... code that is compiled otherwise ...
}
La cláusula else es opcional. Tanto la expresión única como el bloque de código anterior se compilan solo cuando el modificador de compilador -debug está habilitado.
En lugar de eliminarse por completo, las líneas se pueden marcar como depuradas.
debug writefln("%s debug only statement", value);
Estas líneas se incluyen en el programa solo cuando el modificador de compilador -debug está habilitado.
dmd test.d -oftest -w -debug
Declaración de depuración (etiqueta) en D
Las declaraciones de depuración pueden recibir nombres (etiquetas) para que se incluyan en el programa de forma selectiva.
debug(mytag) writefln("%s not found", value);
Estas líneas se incluyen en el programa solo cuando el modificador de compilador -debug está habilitado.
dmd test.d -oftest -w -debug = mytag
Los bloques de depuración también pueden tener etiquetas.
debug(mytag) {
//
}
Es posible habilitar más de una etiqueta de depuración a la vez.
dmd test.d -oftest -w -debug = mytag1 -debug = mytag2
Declaración de depuración (nivel) en D
A veces es más útil asociar declaraciones de depuración por niveles numéricos. El aumento de los niveles puede proporcionar información más detallada.
import std.stdio;
void myFunction() {
debug(1) writeln("debug1");
debug(2) writeln("debug2");
}
void main() {
myFunction();
}
Se compilarían las expresiones de depuración y los bloques que sean inferiores o iguales al nivel especificado.
$ dmd test.d -oftest -w -debug = 1
$ ./test
debug1
Declaraciones de versión (etiqueta) y versión (nivel) en D
La versión es similar a la de depuración y se usa de la misma manera. La cláusula else es opcional. Aunque la versión funciona esencialmente igual que la depuración, tener palabras clave separadas ayuda a distinguir sus usos no relacionados. Al igual que con la depuración, se puede habilitar más de una versión.
import std.stdio;
void myFunction() {
version(1) writeln("version1");
version(2) writeln("version2");
}
void main() {
myFunction();
}
Se compilarían las expresiones de depuración y los bloques que sean inferiores o iguales al nivel especificado.
$ dmd test.d -oftest -w -version = 1
$ ./test
version1
Estático si
Static if es el tiempo de compilación equivalente a la sentencia if. Al igual que la instrucción if, static if toma una expresión lógica y la evalúa. A diferencia de la instrucción if, static if no se trata del flujo de ejecución; más bien, determina si un fragmento de código debe incluirse en el programa o no.
La expresión if no está relacionada con el operador is que hemos visto antes, tanto sintácticamente como semánticamente. Se evalúa en tiempo de compilación. Produce un valor int, 0 o 1; dependiendo de la expresión especificada entre paréntesis. Aunque la expresión que toma no es una expresión lógica, la expresión is en sí se usa como expresión lógica en tiempo de compilación. Es especialmente útil en condicionales if estáticas y restricciones de plantilla.
import std.stdio;
enum Days {
sun,
mon,
tue,
wed,
thu,
fri,
sat
};
void myFunction(T)(T mytemplate) {
static if (is (T == class)) {
writeln("This is a class type");
} else static if (is (T == enum)) {
writeln("This is an enum type");
}
}
void main() {
Days day;
myFunction(day);
}
Cuando compilamos y ejecutamos, obtendremos algunos resultados de la siguiente manera.
This is an enum type