- D 编程基础
- D 编程 - 首页
- D 编程 - 概述
- D 编程 - 环境
- D 编程 - 基本语法
- D 编程 - 变量
- D 编程 - 数据类型
- D 编程 - 枚举
- D 编程 - 字面量
- D 编程 - 运算符
- D 编程 - 循环
- D 编程 - 条件语句
- D 编程 - 函数
- D 编程 - 字符
- D 编程 - 字符串
- D 编程 - 数组
- D 编程 - 关联数组
- D 编程 - 指针
- D 编程 - 元组
- D 编程 - 结构体
- D 编程 - 联合体
- D 编程 - 范围
- D 编程 - 别名
- D 编程 - Mixin
- D 编程 - 模块
- D 编程 - 模板
- D 编程 - 不可变性
- D 编程 - 文件 I/O
- D 编程 - 并发
- D 编程 - 异常处理
- D 编程 - 合约
- D - 条件编译
- D 编程 - 面向对象
- D 编程 - 类与对象
- D 编程 - 继承
- D 编程 - 重载
- D 编程 - 封装
- D 编程 - 接口
- D 编程 - 抽象类
- D 编程 - 有用资源
- D 编程 - 快速指南
- D 编程 - 有用资源
- D 编程 - 讨论
D 编程 - 条件编译
条件编译是选择编译哪些代码以及不编译哪些代码的过程,类似于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。
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块也可以有标签。
debug(mytag) { // }
可以一次启用多个debug标签。
dmd test.d -oftest -w -debug = mytag1 -debug = mytag2
D语言中的Debug(level)语句
有时,按数值级别关联调试语句更有用。更高的级别可以提供更详细的信息。
import std.stdio; void myFunction() { debug(1) writeln("debug1"); debug(2) writeln("debug2"); } void main() { myFunction(); }
将编译低于或等于指定级别的debug表达式和块。
$ dmd test.d -oftest -w -debug = 1 $ ./test debug1
D语言中的Version(tag)和Version(level)语句
Version类似于debug,使用方法相同。else子句是可选的。虽然version的工作原理与debug基本相同,但使用单独的关键字有助于区分它们不相关的用途。与debug一样,可以启用多个version。
import std.stdio; void myFunction() { version(1) writeln("version1"); version(2) writeln("version2"); } void main() { myFunction(); }
将编译低于或等于指定级别的debug表达式和块。
$ dmd test.d -oftest -w -version = 1 $ ./test version1
Static if
Static if是if语句的编译时等价物。就像if语句一样,static if接受一个逻辑表达式并对其进行评估。与if语句不同的是,static if与执行流程无关;它确定是否应将一段代码包含在程序中。
if表达式在语法和语义上都与我们之前看到的is运算符无关。它在编译时计算。它生成一个int值,0或1;取决于括号中指定的表达式。虽然它接受的表达式不是逻辑表达式,但is表达式本身用作编译时逻辑表达式。它在static 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