條件編譯是選擇編譯以及程式碼,程式碼無法編譯類似的#if/#其他/#endif在C和C ++中。未在編譯的任何宣告仍然必須是語法正確。條件編譯涉及到條件檢查是在編譯時計算。就像如果執行條件語句,為,而不是條件編譯的功能。以下是D程式專門為條件編譯的功能。
debug
version/p>
static if
偵錯程式開發過程中是非常有用的。標記為偵錯的表示式和語句被編譯成只在偵錯編譯器開關啟用程式。
debug a_conditionally_compiled_expression; debug { // ... conditionally compiled code ... } else { // ... code that is compiled otherwise ... }
else子句是可選的。無論是單個表示式和上面的程式碼塊只有當偵錯編譯器開關啟用編譯。
而不是完全取消的,該行可以代替被標記為偵錯。
debug writefln("%s debug only statement", value);
這樣的行都包含在僅在偵錯編譯器開關啟用程式。
dmd test.d -oftest -w -debug
偵錯語句可以給出的名稱(標籤)被列入程式選擇性。
debug(mytag) writefln("%s not found", value);
這樣的行包含僅在偵錯編譯器開關啟用程式。
dmd test.d -oftest -w -debug=mytag
偵錯塊也可以有標籤。
debug(mytag) { // }
這是可能的,以使多個偵錯標記的時間。
dmd test.d -oftest -w -debug=mytag1 -debug=mytag2
有時,偵錯語句通過數值級別關聯是比較有用的。提高階別可以提供更詳細的資訊。
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
版本是類似於偵錯,並用於以相同的方式。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 是編譯時相當於if語句中。就像if語句,static if 需要一個邏輯表示式,並計算它。不同的是if語句,static if 不是關於執行流程;更確切地說,它確定一塊程式碼是否應當包括在程式或不包括。
表達是無關的是運算子,我們已經看到在空值和操作是段落,既語法和語意。下表示式是在編譯時計算。它產生一個int值,0或1;取決於在括號中指定的表示式。雖然,它需要表達的是不是一個邏輯表示式,該表示式是本身被用作一個編譯時邏輯表示式。它是靜態的特別有用的,如果條件和模板的約束。
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