D 语言 - 条件编译

条件编译是选择编译哪些代码和不编译哪些代码的过程,类似于C和C++中的#if / #else / #endif。 任何未在 still 中编译的语句都必须在语法上正确。

条件编译涉及可在编译时评估的条件检查。 if、for、while 等运行时条件语句不是条件编译功能。 D 的以下功能适用于条件编译 −

  • debug
  • version
  • static if

D 中的 debug 调试语句

debug 调试语句在程序开发过程中很有用。 仅当启用 -debug 编译器开关时,标记为 debug 的表达式和语句才会编译到程序中。

debug a_conditionally_compiled_expression;
   
debug { 
   // ... 条件编译代码 ... 
} else { 
   // ... 以其他方式编译的代码 ... 
}

else 子句是可选的。 仅当启用 -debug 编译器开关时,才会编译单个表达式和上面的代码块。

这些行可以标记为调试,而不是完全删除。

debug writefln("%s debug only statement", value); 

仅当启用 -debug 编译器开关时,这些行才会包含在程序中。

dmd test.d -oftest -w -debug 

D 中的 Debug (tag) 语句

可以为调试语句指定标签名称(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 中的 Debug (level) 语句

有时,通过数字level(级别)关联调试语句更有用。 提高级别可以提供更详细的信息。

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 中的Version (tag) 和 Version (level)语句

Version和debug类似,使用方法也一样。 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

static if 是 if 语句的编译时等效项。 就像 if 语句一样,静态 if 接受一个逻辑表达式并对其求值。 与 if 语句不同,静态 if 与执行流程无关; 相反,它决定一段代码是否应该包含在程序中。

if 表达式在语法和语义上都与我们之前看到的 is 运算符无关。 它是在编译时评估的。 它产生一个 int 值,要么是 0,要么是 1; 取决于括号中指定的表达式。 尽管它采用的表达式不是逻辑表达式,但 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