Erzwinge, dass der Compiler einige Zeilen im Programm ignoriert
Vermute, dass ich 10.000 Zeilen C++ - code. 200 Zeilen dieses Codes sind für Test-Zwecke (zum Beispiel, überprüfen Sie das Programm und zeigen eine Fehlermeldung).
Gibt es eine Möglichkeit in C++ zu ignorieren oder zu prüfen, einige Linien des Codes (vielleicht mit Präprozessor keywords)?
Kommentar zu dem Problem
#ifdef TESTS
aufgerufen wird bedingte Kompilierung. Als ich sah, dass der Titel für diese Frage, habe ich sofort gedacht "Uh, kommentieren Sie Sie aus?" 😉
Die Frage beschäftigt mich, weil statt 200 Zeilen code, eingebettet in 10.000 Zeilen (vermutlich in vielen Dateien), wäre es sinnvoll, das testen von code in bestimmten unit-test, und/oder die integration von test-Dateien. Auch 200 test-Leitungen für 10K Zeilen des production code (2%) sehr wahrscheinlich bedeutet, dass Sie haben eine sehr geringe Testabdeckung. Ich weiß, das ist nicht der Fokus von der Frage (also einen Kommentar statt einer Antwort), aber ich denke, Sie sollten bewerten Sie Ihre Test-Strategie.
Ich bin unglaublich überrascht dies nicht doppelt nach all den Jahren der StackOverflow.
Jeder scheint zu sein, was darauf hindeutet,
#ifdef
(oder #if defined
). Das ist schlechter Stil und borderline-völlig gebrochen. Verwenden Sie #if
, nicht #ifdef
. Der Grund ist, dass #define IS_TEST_BUILD 0
sollte das gleiche tun wie #undef IS_TEST_BUILD
, nicht das gleiche wie #define IS_TEST_BUILD 1
. InformationsquelleAutor der Frage user1436187 | 2014-01-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort:
Verwenden Makros und
#ifdef
überprüfen. Zum Beispiel:den code in diesem Bereich wird nur kompiliert werden, wenn Sie bereits definiert
MY_CONTROL_MACRO
makro.Mehr Zeug:
Definieren, wie ein makro, du kannst
#define MY_CONTROL_MACRO
zu Ihrem code. Oder,MY_CONTROL_MACRO
zuProject > Properties > C/C++ > Preprocessor > Preprocessor Definitions
. Oder,-DMY_CONTROL_MACRO
.Können Sie aus hier für mehr info.
Können Sie auch die erweiterte
ifdef-else-endif
Stil:InformationsquelleAutor der Antwort herohuyongtao
Surround-code mit "#ifdef...#endif", und dann verwenden Sie die compiler-Optionen, um die Flagge:
Können Sie dann verwenden Sie die compiler-Optionen enthalten diesen code. Zum Beispiel in GCC:
Obwohl, um ehrlich zu sein, ich denke, dieser Ansatz ist in der Regel nicht sehr gut wartbar in großen Projekten und, wenn möglich, ist es im Allgemeinen besser, bewegen Sie einfach den test-code nur eine separate Bibliothek (ohne diese bedingte Logik) und einfach den link-code in Ihrem test binäre eher als Ihre nicht-test binären. Auch wird verhindert, dass zu kompilieren jeder der anderen Bibliotheken sowohl in der debug-und nicht-debug-Modus.
InformationsquelleAutor der Antwort Michael Aaron Safyan
Dies ist, was
#ifdef
wurde fürSetzen Sie
dann können Sie übergeben, um die compiler-Optionen zu entscheiden, wenn Sie möchten, dass der test-Teil einkompiliert oder nicht. Zum Beispiel mit g++ es ist
InformationsquelleAutor der Antwort 6502
Gehen mit der bestehenden Konvention, und verwenden Sie die
NDEBUG
makro. Alle gängigen Compiler definieren Sie dieses makro für release baut, und nicht definieren, es für debug baut.Das makro ursprünglich gab es zum Steuern der Ausgabe von
assert(3)
, und ist definiert als solche ganzen Weg zurück in der POSIX-standard und mindestens seit C89.Beachten Sie, dass der umgekehrte test mit
#ifndef
.Beispiel:
P. S. Mit
gcc
/g++
haben Sie eine debug-build hinzufügen-g
auf der Kommandozeile.InformationsquelleAutor der Antwort Michael Hampton
Mit einem Präprozessor-guard ist definitiv die flexible und gemeinsamen Ansatz. Allerdings, wenn möglich, ich schlage vor, mit einer if-Anweisung. Zum Beispiel, anstelle von
Vorausgesetzt ENABLE_DEBUG ist definiert als 0 oder nicht-null, würde ich
Seit ENABLE_DEBUG ist eine Konstante, wenn ENABLE_DEBUG ist 0 der compiler keinen code generieren für Aussagen, die er bewacht. Also, warum verwenden Sie diese Methode anstelle von #ifdef?
Offensichtlich dieser Ansatz funktioniert nur für debug-Anweisungen innerhalb der Methode/Funktion stellen.
InformationsquelleAutor der Antwort TheDuke
Surround, Ihre Prüf-code
#ifdef DEBUG
.InformationsquelleAutor der Antwort Richard Schneider
Dem Weg zu gehen, ist mit Präprozessor-Direktive mit der
define
an den compiler übergeben oder aus einer header "config.h":Zu vermeiden, um überall im source-code:
Können Sie in der Kopfzeile
Und so verwenden
My_Debug_function
fast normal.InformationsquelleAutor der Antwort Jarod42
Verwenden Präprozessor #define und #if
je nach compiler, sollten Sie einige Variablen zur Verfügung, die standardmäßig ich.e NDEBUG (für nicht-debug) oder DEBUG
können Sie eine variable definieren sich selbst im code
und verwenden Sie es wie folgt
weitere Informationen suchen Sie online nach
InformationsquelleAutor der Antwort user3218782