Условная компиляция — это процесс выбора, какой код компилировать, а какой код не компилировать, аналогично #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 используется как логическое выражение времени компиляции. Это особенно полезно в статических условных и шаблонных ограничениях.
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); }
Когда мы скомпилируем и запустим, мы получим следующий вывод: