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