条件编译( Conditional Compilation)
条件编译是选择要编译的代码和不编译的代码的过程,类似于C和C ++中的#if/#else/#endif。 任何未编译的语句仍必须在语法上正确。
条件编译涉及在编译时可评估的条件检查。 像if,for,while这样的运行时条件语句不是条件编译功能。 D的以下特征适用于条件编译 -
- debug
- version
- static if
D中的调试声明
debug在程序开发期间很有用。 仅当启用了-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(tag)语句
调试语句可以被赋予名称(标签)以有选择地包括在程序中。
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子句是可选的。 尽管版本与调试基本相同,但使用单独的关键字有助于区分其不相关的用途。 与debug一样,可以启用多个版本。
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语句不同,static if与执行流程无关; 相反,它确定一段代码是否应该包含在程序中。
if表达式与我们之前看到的is运算符无关,无论是语法还是语义。 它在编译时进行评估。 它产生一个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