D编程 条件编译
条件语句涉及可在编译时判断的条件检查,运行时条件语句(如if,for,while)不是条件编译函数, D的以下函数用于条件编译-
- debug
- version
- static if
调试语句
调试在程序开发过程中很有用。仅当启用-debug编译器开关时,才会将标签为debug的表达式和语句编译到程序中。
debug a_conditionally_compiled_expression;
debug {
//... conditionally compiled code ...
} else {
//... code that is compiled otherwise ...
}
else子句是可选的。仅在启用-debug编译器开关时,才编译单个表达式和上面的代码块。
这些行可以完全标签为debug而不是完全删除。
debug writefln("%s debug only statement", value);
仅当启用-debug编译器开关时,此类行才包含在程序中。
dmd test.d -oftest -w -debug
Debug语句
可以给调试语句指定名称(标签),以便有选择地包含在程序中。
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
调试级别
有时,按数字级别关联调试语句会更有用。级别增加可以提供更多详细信息。
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
Debug和Version示例
版本类似于调试,并且以相同的方式使用。 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语句的编译时等效项。就像if语句一样,静态 if接受逻辑表达式并对其求值。与if语句不同,静态 if与执行流程无关;相反,它确定程序中是否应包含一段代码。
在语法和语义上,if表达式都与我们之前所见的is运算符无关。它在编译时判断。它产生一个整数值,0或1;否则为0。取决于括号中指定的表达式。尽管它采用的表达式不是逻辑表达式,但是is表达式本身用作编译时逻辑表达式。如果条件和模板约束,它在静态中特别有用。
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