條件語(yǔ)句涉及可在編譯時(shí)判斷的條件檢查,運(yùn)行時(shí)條件語(yǔ)句(如if,for,while)不是條件編譯函數(shù), D的以下函數(shù)用于條件編譯-
調(diào)試在程序開(kāi)發(fā)過(guò)程中很有用。僅當(dāng)啟用-debug編譯器開(kāi)關(guān)時(shí),才會(huì)將標(biāo)簽為debug的表達(dá)式和語(yǔ)句編譯到程序中。
debug a_conditionally_compiled_expression;
debug {
//... conditionally compiled code ...
} else {
//... code that is compiled otherwise ...
}
else子句是可選的。僅在啟用-debug編譯器開(kāi)關(guān)時(shí),才編譯單個(gè)表達(dá)式和上面的代碼塊。
這些行可以完全標(biāo)簽為debug而不是完全刪除。
debug writefln("%s debug only statement", value);
僅當(dāng)啟用-debug編譯器開(kāi)關(guān)時(shí),此類(lèi)行才包含在程序中。
dmd test.d -oftest -w -debug
可以給調(diào)試語(yǔ)句指定名稱(chēng)(標(biāo)簽),以便有選擇地包含在程序中。
debug(mytag) writefln("%s not found", value);
僅當(dāng)啟用-debug編譯器開(kāi)關(guān)時(shí),此類(lèi)行才包含在程序中。
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
有時(shí),按數(shù)字級(jí)別關(guān)聯(lián)調(diào)試語(yǔ)句會(huì)更有用。級(jí)別增加可以提供更多詳細(xì)信息。
import std.stdio;
void myFunction() {
debug(1) writeln("debug1");
debug(2) writeln("debug2");
}
void main() {
myFunction();
}
低于或等于指定級(jí)別的調(diào)試表達(dá)式和塊將被編譯。
$dmd test.d -oftest -w -debug=1
$./test
debug1
版本類(lèi)似于調(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();
}
低于或等于指定級(jí)別的調(diào)試表達(dá)式和塊將被編譯。
$dmd test.d -oftest -w -version=1
$./test
version1
靜態(tài)if是if語(yǔ)句的編譯時(shí)等效項(xiàng)。就像if語(yǔ)句一樣,靜態(tài) if接受邏輯表達(dá)式并對(duì)其求值。與if語(yǔ)句不同,靜態(tài) if與執(zhí)行流程無(wú)關(guān);相反,它確定程序中是否應(yīng)包含一段代碼。
在語(yǔ)法和語(yǔ)義上,if表達(dá)式都與我們之前所見(jiàn)的is運(yùn)算符無(wú)關(guān)。它在編譯時(shí)判斷。它產(chǎn)生一個(gè)整數(shù)值,0或1;否則為0。取決于括號(hào)中指定的表達(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
更多建議: