Программирование на языке D - условная компиляция
Условная компиляция - это процесс выбора того, какой код компилировать и какой код не компилировать, аналогично #if / #else / #endif в C и C ++. Любой оператор, который не скомпилирован, должен быть синтаксически правильным.
Условная компиляция включает проверки условий, которые можно оценить во время компиляции. Условные операторы времени выполнения, такие как if, for, while, не являются функциями условной компиляции. Следующие функции D предназначены для условной компиляции:
- debug
- version
- статический, если
Заявление отладки в 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 используется как логическое выражение времени компиляции. Это особенно полезно в статических условных выражениях if и ограничениях шаблонов.
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);
}
Когда мы скомпилируем и запустим, мы получим следующий результат.
This is an enum type