Dプログラミング-条件付きコンパイル
条件付きコンパイルは、CおよびC ++の#if / #else / #endifと同様に、コンパイルするコードとコンパイルしないコードを選択するプロセスです。コンパイルされていないステートメントは、構文的に正しい必要があります。
条件付きコンパイルには、コンパイル時に評価可能な条件チェックが含まれます。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演算子とは無関係です。コンパイル時に評価されます。0または1のいずれかのint値を生成します。括弧内に指定された式によって異なります。取る式は論理式ではありませんが、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