D編程 條件編譯

2021-09-01 10:44 更新

條件語句涉及可在編譯時(shí)判斷的條件檢查,運(yùn)行時(shí)條件語句(如if,for,while)不是條件編譯函數(shù), D的以下函數(shù)用于條件編譯-

  • debug
  • version
  • static if

調(diào)試語句

調(diào)試在程序開發(fā)過程中很有用。僅當(dāng)啟用-debug編譯器開關(guān)時(shí),才會將標(biāo)簽為debug的表達(dá)式和語句編譯到程序中。

debug a_conditionally_compiled_expression;
   
debug { 
   //... conditionally compiled code ... 
} else { 
   //... code that is compiled otherwise ... 
}

else子句是可選的。僅在啟用-debug編譯器開關(guān)時(shí),才編譯單個(gè)表達(dá)式和上面的代碼塊。

這些行可以完全標(biāo)簽為debug而不是完全刪除。

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

僅當(dāng)啟用-debug編譯器開關(guān)時(shí),此類行才包含在程序中。

dmd test.d -oftest -w -debug 

Debug語句

可以給調(diào)試語句指定名稱(標(biāo)簽),以便有選擇地包含在程序中。

debug(mytag) writefln("%s not found", value);

僅當(dāng)啟用-debug編譯器開關(guān)時(shí),此類行才包含在程序中。

dmd test.d -oftest -w -debug=mytag

調(diào)試塊也可以具有標(biāo)簽。

debug(mytag) { 
   //
}

一次可以啟用多個(gè)調(diào)試標(biāo)簽。

dmd test.d -oftest -w -debug=mytag1 -debug=mytag2

調(diào)試級別

有時(shí),按數(shù)字級別關(guān)聯(lián)調(diào)試語句會更有用。級別增加可以提供更多詳細(xì)信息。

import std.stdio;  

void myFunction() { 
   debug(1) writeln("debug1"); 
   debug(2) writeln("debug2");
}

void main() { 
   myFunction(); 
} 

低于或等于指定級別的調(diào)試表達(dá)式和塊將被編譯。

$dmd test.d -oftest -w -debug=1 
$./test 
debug1 

Debug和Version示例

版本類似于調(diào)試,并且以相同的方式使用。 else子句是可選的。盡管版本在本質(zhì)上與調(diào)試相同,但是使用單獨(dú)的關(guān)鍵字有助于區(qū)分它們的不相關(guān)用法。與調(diào)試一樣,可以啟用多個(gè)版本。

import std.stdio;  

void myFunction() { 
   version(1) writeln("version1"); 
   version(2) writeln("version2");     
}
  
void main() { 
   myFunction(); 
}

低于或等于指定級別的調(diào)試表達(dá)式和塊將被編譯。

$dmd test.d -oftest -w -version=1 
$./test 
version1 

static if

靜態(tài)if是if語句的編譯時(shí)等效項(xiàng)。就像if語句一樣,靜態(tài) if接受邏輯表達(dá)式并對其求值。與if語句不同,靜態(tài) if與執(zhí)行流程無關(guān);相反,它確定程序中是否應(yīng)包含一段代碼。

在語法和語義上,if表達(dá)式都與我們之前所見的is運(yùn)算符無關(guān)。它在編譯時(shí)判斷。它產(chǎn)生一個(gè)整數(shù)值,0或1;否則為0。取決于括號中指定的表達(dá)式。盡管它采用的表達(dá)式不是邏輯表達(dá)式,但是is表達(dá)式本身用作編譯時(shí)邏輯表達(dá)式。如果條件和模板約束,它在靜態(tài)中特別有用。

 
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); 
} 

當(dāng)我們編譯并運(yùn)行時(shí),我們將得到如下輸出。

This is an enum type


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號