D-programming-conditional-compilation

提供:Dev Guides
移動先:案内検索

Dプログラミング-条件付きコンパイル

条件付きコンパイルは、CおよびC ++の#if/#else/#endifと同様に、コンパイルするコードとコンパイルしないコードを選択するプロセスです。 まだコンパイルされていないステートメントは、構文的に正しいものでなければなりません。

条件付きコンパイルには、コンパイル時に評価可能な条件チェックが含まれます。 if、for、whileなどのランタイム条件ステートメントは、条件付きコンパイル機能ではありません。 Dの次の機能は、条件付きコンパイル用です-

  • デバッグ
  • バージョン
  • 静的な場合

Dのデバッグステートメント

_debug_は、プログラム開発中に役立ちます。 デバッグとしてマークされた式とステートメントは、-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ステートメントと同様に、静的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