条件编译是选择编译以及代码,代码无法编译类似的#if/#其他/#endif在C和C ++中。未在编译的任何声明仍然必须是语法正确。条件编译涉及到条件检查是在编译时计算。就像如果运行条件语句,为,而不是条件编译的功能。以下是D程序专门为条件编译的功能。
debug
version/p>
static if
调试程序开发过程中是非常有用的。标记为调试的表达式和语句被编译成只在调试编译器开关启用程序。
debug a_conditionally_compiled_expression; debug { // ... conditionally compiled code ... } else { // ... code that is compiled otherwise ... }
else子句是可选的。无论是单个表达式和上面的代码块只有当调试编译器开关启用编译。
而不是完全取消的,该行可以代替被标记为调试。
debug writefln("%s debug only statement", value);
这样的行都包含在仅在调试编译器开关启用程序。
dmd test.d -oftest -w -debug
调试语句可以给出的名称(标签)被列入程序选择性。
debug(mytag) writefln("%s not found", value);
这样的行包含仅在调试编译器开关启用程序。
dmd test.d -oftest -w -debug=mytag
调试块也可以有标签。
debug(mytag) { // }
这是可能的,以使多个调试标记的时间。
dmd test.d -oftest -w -debug=mytag1 -debug=mytag2
有时,调试语句通过数值级别关联是比较有用的。提高级别可以提供更详细的信息。
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
版本是类似于调试,并用于以相同的方式。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
static if 是编译时相当于if语句中。就像if语句,static if 需要一个逻辑表达式,并计算它。不同的是if语句,static if 不是关于执行流程;更确切地说,它确定一块代码是否应当包括在程序或不包括。
表达是无关的是运算符,我们已经看到在空值和操作是段落,既语法和语义。下表达式是在编译时计算。它产生一个int值,0或1;取决于在括号中指定的表达式。虽然,它需要表达的是不是一个逻辑表达式,该表达式是本身被用作一个编译时逻辑表达式。它是静态的特别有用的,如果条件和模板的约束。
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