Учебники

D Программирование — условная компиляция

Условная компиляция — это процесс выбора, какой код компилировать, а какой код не компилировать, аналогично #if / #else / #endif в C и C ++. Любое утверждение, которое не скомпилировано, должно быть синтаксически правильным.

Условная компиляция включает в себя проверки условий, которые можно оценить во время компиляции. Условные операторы времени выполнения, такие как if, for, не являются условными компонентами компиляции. Следующие особенности D предназначены для условной компиляции —

  • отлаживать
  • версия
  • статический, если

Отладка оператора в D

Отладка полезна при разработке программы. Выражения и операторы, помеченные как отладочные, компилируются в программу только при включенном параметре компилятора -debug.

debug a_conditionally_compiled_expression;
   
debug { 
   // ... conditionally compiled code ... 
} else { 
   // ... code that is compiled otherwise ... 
}

Предложение else является необязательным. И отдельное выражение, и приведенный выше блок кода компилируются только при включенном ключе компилятора -debug.

Вместо полного удаления строки могут быть помечены как отладочные.

debug writefln("%s debug only statement", value); 

Такие строки включаются в программу, только если включен параметр компилятора -debug.

dmd test.d -oftest -w -debug 

Отладка (тег) оператор в D

Операторам отладки могут быть заданы имена (теги) для выборочного включения в программу.

debug(mytag) writefln("%s not found", value);

Такие строки включаются в программу, только если включен параметр компилятора -debug.

dmd test.d -oftest -w -debug = mytag

Блоки отладки также могут иметь теги.

debug(mytag) { 
   //  
}

Можно включить более одного тега отладки одновременно.

dmd test.d -oftest -w -debug = mytag1 -debug = mytag2

Отладка (уровень) Заявление в D

Иногда полезно связать операторы отладки по числовым уровням. Повышение уровня может предоставить более подробную информацию.

import std.stdio;  

void myFunction() { 
   debug(1) writeln("debug1"); 
   debug(2) writeln("debug2");
}

void main() { 
   myFunction(); 
} 

Выражения отладки и блоки, которые ниже или равны указанному уровню, будут скомпилированы.

$ dmd test.d -oftest -w -debug = 1 
$ ./test 
debug1 

Версия (тег) и версия (уровень) Заявления в D

Версия похожа на отладку и используется таким же образом. Предложение else является необязательным. Хотя версия работает по сути так же, как и отладка, наличие отдельных ключевых слов помогает различать их несвязанное использование. Как и в случае с отладкой, можно включить более одной версии.

import std.stdio;  

void myFunction() { 
   version(1) writeln("version1"); 
   version(2) writeln("version2");     
}
  
void main() { 
   myFunction(); 
}

Выражения отладки и блоки, которые ниже или равны указанному уровню, будут скомпилированы.

$ dmd test.d -oftest -w -version = 1 
$ ./test 
version1 

Статическое если

Статический if является эквивалентом времени компиляции оператора if. Точно так же, как оператор if, static if принимает логическое выражение и оценивает его. В отличие от оператора if, статический if не относится к потоку выполнения; скорее он определяет, должен ли фрагмент кода быть включен в программу или нет.

Выражение if не связано с оператором is, который мы видели ранее, как синтаксически, так и семантически. Он оценивается во время компиляции. Он выдает значение типа int либо 0, либо 1; в зависимости от выражения, указанного в скобках. Хотя выражение, которое оно принимает, не является логическим выражением, само выражение is используется как логическое выражение времени компиляции. Это особенно полезно в статических условных и шаблонных ограничениях.

Live Demo

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); 
} 

Когда мы скомпилируем и запустим, мы получим следующий вывод: