Programação D - Compilação Condicional
Compilação condicional é o processo de selecionar qual código compilar e qual código não compilar, semelhante a #if / #else / #endif em C e C ++. Qualquer instrução que não seja compilada ainda deve ser sintaticamente correta.
A compilação condicional envolve verificações de condições que podem ser avaliadas em tempo de compilação. Instruções condicionais de tempo de execução como if, for e while não são recursos de compilação condicional. Os seguintes recursos de D são destinados à compilação condicional -
- debug
- version
- estático se
Declaração de depuração em D
A depuração é útil durante o desenvolvimento do programa. As expressões e instruções marcadas como depuração são compiladas no programa apenas quando a opção do compilador -debug está ativada.
debug a_conditionally_compiled_expression;
debug {
// ... conditionally compiled code ...
} else {
// ... code that is compiled otherwise ...
}
A cláusula else é opcional. Tanto a expressão única quanto o bloco de código acima são compilados apenas quando a opção -debug do compilador está ativada.
Em vez de serem totalmente removidas, as linhas podem ser marcadas como depuração.
debug writefln("%s debug only statement", value);
Essas linhas são incluídas no programa apenas quando a opção -debug do compilador está ativada.
dmd test.d -oftest -w -debug
Declaração de depuração (tag) em D
As instruções de depuração podem receber nomes (tags) para serem incluídas no programa seletivamente.
debug(mytag) writefln("%s not found", value);
Essas linhas são incluídas no programa apenas quando a opção -debug do compilador está ativada.
dmd test.d -oftest -w -debug = mytag
Os blocos de depuração também podem ter tags.
debug(mytag) {
//
}
É possível habilitar mais de uma tag de depuração por vez.
dmd test.d -oftest -w -debug = mytag1 -debug = mytag2
Declaração de depuração (nível) em D
Às vezes, é mais útil associar instruções de depuração por níveis numéricos. Níveis crescentes podem fornecer informações mais detalhadas.
import std.stdio;
void myFunction() {
debug(1) writeln("debug1");
debug(2) writeln("debug2");
}
void main() {
myFunction();
}
As expressões de depuração e os blocos que são menores ou iguais ao nível especificado seriam compilados.
$ dmd test.d -oftest -w -debug = 1
$ ./test
debug1
Declarações de versão (tag) e versão (nível) em D
A versão é semelhante à depuração e é usada da mesma maneira. A cláusula else é opcional. Embora a versão funcione essencialmente da mesma forma que a depuração, ter palavras-chave separadas ajuda a distinguir seus usos não relacionados. Tal como acontece com a depuração, mais de uma versão pode ser habilitada.
import std.stdio;
void myFunction() {
version(1) writeln("version1");
version(2) writeln("version2");
}
void main() {
myFunction();
}
As expressões de depuração e os blocos que são menores ou iguais ao nível especificado seriam compilados.
$ dmd test.d -oftest -w -version = 1
$ ./test
version1
Estático se
If estático é o equivalente em tempo de compilação da instrução if. Assim como a instrução if, o if estático pega uma expressão lógica e a avalia. Ao contrário da instrução if, o if estático não é sobre fluxo de execução; em vez disso, determina se um trecho de código deve ser incluído no programa ou não.
A expressão if não está relacionada ao operador is que vimos anteriormente, tanto sintaticamente quanto semanticamente. Ele é avaliado em tempo de compilação. Ele produz um valor int, 0 ou 1; dependendo da expressão especificada entre parênteses. Embora a expressão que ele leva não seja uma expressão lógica, a própria expressão é usada como uma expressão lógica de tempo de compilação. É especialmente útil em restrições estáticas se condicionais e de modelo.
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);
}
Quando compilarmos e executarmos, obteremos alguma saída como segue.
This is an enum type