D Programmierung - Bedingte Kompilierung
Bei der bedingten Kompilierung wird ausgewählt, welcher Code kompiliert werden soll und welcher Code nicht kompiliert werden soll, ähnlich wie bei #if / #else / #endif in C und C ++. Jede Anweisung, die noch nicht kompiliert wurde, muss syntaktisch korrekt sein.
Die bedingte Kompilierung umfasst Bedingungsprüfungen, die zur Kompilierungszeit ausgewertet werden können. Bedingte Laufzeitanweisungen wie if, for, while sind keine bedingten Kompilierungsfunktionen. Die folgenden Funktionen von D sind für die bedingte Kompilierung vorgesehen:
- debug
- version
- statisch wenn
Debug-Anweisung in D.
Das Debugging ist während der Programmentwicklung hilfreich. Die als Debug gekennzeichneten Ausdrücke und Anweisungen werden nur dann in das Programm kompiliert, wenn der Compiler-Schalter -debug aktiviert ist.
debug a_conditionally_compiled_expression;
debug {
// ... conditionally compiled code ...
} else {
// ... code that is compiled otherwise ...
}
Die else-Klausel ist optional. Sowohl der einzelne Ausdruck als auch der obige Codeblock werden nur kompiliert, wenn der Compiler-Schalter -debug aktiviert ist.
Anstatt vollständig entfernt zu werden, können die Zeilen stattdessen als Debug markiert werden.
debug writefln("%s debug only statement", value);
Solche Zeilen sind nur dann im Programm enthalten, wenn der Compiler-Schalter -debug aktiviert ist.
dmd test.d -oftest -w -debug
Debug (Tag) -Anweisung in D.
Den Debug-Anweisungen können Namen (Tags) zugewiesen werden, die selektiv in das Programm aufgenommen werden sollen.
debug(mytag) writefln("%s not found", value);
Solche Zeilen sind nur dann im Programm enthalten, wenn der Compiler-Schalter -debug aktiviert ist.
dmd test.d -oftest -w -debug = mytag
Die Debug-Blöcke können auch Tags haben.
debug(mytag) {
//
}
Es ist möglich, mehr als ein Debug-Tag gleichzeitig zu aktivieren.
dmd test.d -oftest -w -debug = mytag1 -debug = mytag2
Debug (Level) -Anweisung in D.
Manchmal ist es sinnvoller, Debug-Anweisungen nach numerischen Ebenen zu verknüpfen. Steigende Stufen können detailliertere Informationen liefern.
import std.stdio;
void myFunction() {
debug(1) writeln("debug1");
debug(2) writeln("debug2");
}
void main() {
myFunction();
}
Die Debug-Ausdrücke und -Blöcke, die kleiner oder gleich der angegebenen Ebene sind, werden kompiliert.
$ dmd test.d -oftest -w -debug = 1
$ ./test
debug1
Versions- (Tag) und Versions- (Level-) Anweisungen in D.
Die Version ähnelt dem Debuggen und wird auf die gleiche Weise verwendet. Die else-Klausel ist optional. Obwohl die Version im Wesentlichen genauso funktioniert wie das Debuggen, hilft die Verwendung separater Schlüsselwörter dabei, ihre nicht verwandten Verwendungen zu unterscheiden. Wie beim Debuggen kann mehr als eine Version aktiviert werden.
import std.stdio;
void myFunction() {
version(1) writeln("version1");
version(2) writeln("version2");
}
void main() {
myFunction();
}
Die Debug-Ausdrücke und -Blöcke, die kleiner oder gleich der angegebenen Ebene sind, werden kompiliert.
$ dmd test.d -oftest -w -version = 1
$ ./test
version1
Statisch wenn
Statisch if ist das Kompilierungszeitäquivalent der if-Anweisung. Genau wie die if-Anweisung nimmt static if einen logischen Ausdruck und wertet ihn aus. Im Gegensatz zur if-Anweisung geht es bei static if nicht um den Ausführungsfluss. Vielmehr wird festgelegt, ob ein Code in das Programm aufgenommen werden soll oder nicht.
Der if-Ausdruck hat nichts mit dem Operator is zu tun, den wir zuvor gesehen haben, sowohl syntaktisch als auch semantisch. Es wird zur Kompilierungszeit ausgewertet. Es wird ein int-Wert erzeugt, entweder 0 oder 1; abhängig von dem in Klammern angegebenen Ausdruck. Obwohl der verwendete Ausdruck kein logischer Ausdruck ist, wird der Ausdruck is selbst als logischer Ausdruck zur Kompilierungszeit verwendet. Es ist besonders nützlich bei statischen Bedingungen und Vorlageneinschränkungen.
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);
}
Wenn wir kompilieren und ausführen, erhalten wir folgende Ausgabe.
This is an enum type