2010-07-06 4 views
6

Gibt es einen Mechanismus in D (D2), um zu erzwingen, dass Code während eines Releasebuilds kompiliert wird?Kompiliercode für die Versionserstellung in D

In C, könnten Sie so etwas wie

#ifndef NDEBUG 
/*Something that will only run in a debug build*/ 
#endif 

ich weiß haben, dass D

debug(mymodule) { 
    //Do something 
} 

hat aber dies muss der Benutzer für jedes Modul passieren -debug es zu aktivieren.

Ich bin auf der Suche nach einem globalen Mechanismus, der immer den Code in einem normalen Build ausführen wird, aber kompilieren Sie es aus, wenn Sie das Release-Flag übergeben. Ich weiß, dass einige Built-Ins diese Fähigkeit haben (z. B. Assert), aber gibt es auch eine Möglichkeit für Benutzercode, dies zu tun?

+1

Ich denke, dass ein Teil des Problems ist, dass 'debug' und' -release' in D. hat nichts miteinander zu tun '-release' bedeutet, dass Sie ein kompilieren Release-Version und es deaktiviert verschiedene Prüfungen (z. B. Assertions). '-debug' aktiviert die Debug-Anweisungen. Daher könnten Sie argumentieren, dass es in D nicht wirklich einen "Debug-Modus" gibt. Sie haben den Release-Modus und den Nicht-Release-Modus mit der Fähigkeit, Debug-Anweisungen in beiden Modi zu aktivieren. Ich glaube nicht, dass '-release' die Semantik Ihres Codes wirklich ändern sollte, wie' -debug' ist, weshalb Sie wahrscheinlich nicht tun können, was Sie versuchen zu tun. –

+0

Ich möchte die Semantik für den Release-Build nicht ändern. Ich bin nur auf der Suche nach dem besten Weg, zusätzliche Überprüfungen, Drucke, etc. in einem Nicht-Release-Build hinzuzufügen, der während der Entwicklung immer eingeschaltet ist. Ich sehe es als etwas, um einem Entwickler zu helfen, Probleme schneller aufzuspüren. Die zusätzlichen Prüfungen und Warnungen können ihnen einen Hinweis geben, welche Module sie aktivieren sollten. – JRM

+1

Ich gab eine Antwort, aber irgendwie fühle ich mich schlecht dabei. Ich würde empfehlen, nur -debug zu verwenden, wenn Sie devvieren und 'debug {// ...}'. Es ist besser, es leichter zu machen, Fehler zu machen, wenn man entschlüsselt, als wenn man es loslässt, imho. – 0scar

Antwort

15

Es gibt eine globale Vorstellung von debug. Schreiben Sie einfach:

debug { 
    ... code ... 
} 
+1

Ich wusste, dass es so etwas Einfaches geben musste. Die D-Programmiersprache erwähnte nur das modulspezifische Debugging, also hatte ich nicht erkannt, dass es auch ein globales war. Jetzt kann ich debuggen {...} für das grundlegende Debugging und debug (mymodule) {...} verwenden, um detaillierteres Debugging hinzuzufügen. – JRM

+1

Genau. Entschuldigungen für die Auslassung. Ich habe ein Erratum in Ihrem Namen hinzugefügt: http://www.erdani.com/tdpl/errata/ –

1

Wenn keine bessere Antwort gefunden wird, sollte ein hackaround wie diese Arbeit: bool debugMode() { bool res; assert(!!(res = true)); return res; }

+1

Ich sehe nicht, wie das funktioniert. – BCS

+2

Das ist die Zuweisung in der Assert. Im Freigabemodus werden das Assert und sein Inhalt kompiliert. Daher findet die Zuweisung nur in Nicht-Release-Builds statt. –

+2

das OP ist auf der Suche nach einer Kompilierzeit Lösung und Assert kommt nie in CTFE heraus. – BCS

3

dmd -release -version=dist module.d

und

version(dist) {} else { 
    int i = 9; 
} 

Beste ich mir vorstellen kann.

[update]

Ich persönlich denke, die oben genannte Antwort "schlecht" ist. Die obige Lösung würde eine übermäßig komplexe Logik in den Freigabeprozess einführen, was meiner Meinung nach geradlinig sein sollte und vorhersagbar sein sollte. Ich würde empfehlen, nur -debug und debug{ //... } zu verwenden. Selbst wenn du denkst, du würdest vergessen, das Debug-Flag hinzuzufügen, wenn du kompilierst - du bist einfach verrückt! - Fehler sind billig. Fehler, die es in die Veröffentlichung bringen, sind schlimmer.

+0

Es ist nicht ganz so ideal, wie ich es mir erhofft hatte, da Sie daran denken müssen, das Flag -version anzugeben, aber diese Details können wahrscheinlich vor dem Endbenutzer im Build-System verborgen werden. – JRM

+0

Dank BCS für die Korrektur. – 0scar