條件編譯是選擇編譯以及代碼,代碼無(wú)法編譯類(lèi)似的#if/#其他/#endif在C和C ++中。未在編譯的任何聲明仍然必須是語(yǔ)法正確。條件編譯涉及到條件檢查是在編譯時(shí)計(jì)算。就像如果運(yùn)行條件語(yǔ)句,為,而不是條件編譯的功能。以下是D程序?qū)iT(mén)為條件編譯的功能。
debug
version/p>
static if
調(diào)試程序開(kāi)發(fā)過(guò)程中是非常有用的。標(biāo)記為調(diào)試的表達(dá)式和語(yǔ)句被編譯成只在調(diào)試編譯器開(kāi)關(guān)啟用程序。
debug a_conditionally_compiled_expression; debug { // ... conditionally compiled code ... } else { // ... code that is compiled otherwise ... }
else子句是可選的。無(wú)論是單個(gè)表達(dá)式和上面的代碼塊只有當(dāng)調(diào)試編譯器開(kāi)關(guān)啟用編譯。
而不是完全取消的,該行可以代替被標(biāo)記為調(diào)試。
debug writefln("%s debug only statement", value);
這樣的行都包含在僅在調(diào)試編譯器開(kāi)關(guān)啟用程序。
dmd test.d -oftest -w -debug
調(diào)試語(yǔ)句可以給出的名稱(標(biāo)簽)被列入程序選擇性。
debug(mytag) writefln("%s not found", value);
這樣的行包含僅在調(diào)試編譯器開(kāi)關(guān)啟用程序。
dmd test.d -oftest -w -debug=mytag
調(diào)試塊也可以有標(biāo)簽。
debug(mytag) { // }
這是可能的,以使多個(gè)調(diào)試標(biāo)記的時(shí)間。
dmd test.d -oftest -w -debug=mytag1 -debug=mytag2
有時(shí),調(diào)試語(yǔ)句通過(guò)數(shù)值級(jí)別關(guān)聯(lián)是比較有用的。提高級(jí)別可以提供更詳細(xì)的信息。
import std.stdio; void myFunction() { debug(1) writeln("debug1"); debug(2) writeln("debug2"); } void main() { myFunction(); }
調(diào)試表達(dá)式和塊為低于或等于指定級(jí)別會(huì)被編譯。
$ dmd test.d -oftest -w -debug=1 $ ./test debug1
版本是類(lèi)似于調(diào)試,并用于以相同的方式。else子句是可選的。雖然版本的作品本質(zhì)上是相同的調(diào)試,有單獨(dú)的關(guān)鍵字可以幫助區(qū)分他們無(wú)關(guān)的用途。與調(diào)試,多個(gè)版本可以啟用。
import std.stdio; void myFunction() { version(1) writeln("version1"); version(2) writeln("version2"); } void main() { myFunction(); }
調(diào)試表達(dá)式和塊為低于或等于指定級(jí)別會(huì)被編譯。
$ dmd test.d -oftest -w -version=1 $ ./test version1
static if 是編譯時(shí)相當(dāng)于if語(yǔ)句中。就像if語(yǔ)句,static if 需要一個(gè)邏輯表達(dá)式,并計(jì)算它。不同的是if語(yǔ)句,static if 不是關(guān)于執(zhí)行流程;更確切地說(shuō),它確定一塊代碼是否應(yīng)當(dāng)包括在程序或不包括。
表達(dá)是無(wú)關(guān)的是運(yùn)算符,我們已經(jīng)看到在空值和操作是段落,既語(yǔ)法和語(yǔ)義。下表達(dá)式是在編譯時(shí)計(jì)算。它產(chǎn)生一個(gè)int值,0或1;取決于在括號(hào)中指定的表達(dá)式。雖然,它需要表達(dá)的是不是一個(gè)邏輯表達(dá)式,該表達(dá)式是本身被用作一個(gè)編譯時(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)行,我們將如下得到一些輸出。
This is an enum type