Angenommen, ich möchte mehrere Arten von Ausgabenachrichten in meinem Code haben. Eine davon ist die DEBUG
, die nur gedruckt wird, wenn der Code im Debug-Modus kompiliert wird.
Normalerweise müsste ich sowas schreiben
#ifdef DEBUG
std::cout << "Debug message" << std::endl;
#endif
Das ist ziemlich umständlich und an vielen Stellen ärgerlich zu bedienen.
Ist es empfehlenswert, ein Makro für das Code-Snippet zu definieren, damit Sie es auf diese Weise verwenden können?
MSG_DEBUG("Debug message")
Oder gibt es eine andere, elegantere Möglichkeit, ohne Makros damit umzugehen? Ich interessiere mich für mögliche Lösungen in C und C ++, da ich beide Sprachen in verschiedenen Projekten verwende.
constexpr if
in C ++ besser implementiert werden .STDERR
. Warum sollte es nicht stattdessen vonNDEBUG
likeassert()
does abhängen ? Dann könnte man es so definieren, dass es auch#define DEBUG_MSG(MSG) assert(std::cerr << MSG)
den Stream-Status testet.Antworten:
Wenn Sie in erster Linie Makros verwenden möchten, sollten Sie einen parametrisierten Code definieren, anstatt den gleichen bedingten Code zu wiederholen.
Sollten Sie überhaupt Makros verwenden? Meines Erachtens sollten Sie dies tun, da dies in C gängige Praxis ist und jede Lösung ohne Makros erfordert, dass zumindest etwas ausgeführt wird, auch außerhalb des Debug-Modus. Der typische C-Programmierer wählt zu jeder Zeit ein leicht hässliches Makro über unnötige Laufzeitbemühungen.
quelle
Hier gibt es ein persönliches Präferenzelement, aber in C ++ mache ich das lieber in der Header-Datei:
Damit wird die Funktion in Release-Builds integriert, ist jedoch eine ordnungsgemäße Funktion im Debug-Build, sodass Sie später eine ordnungsgemäße Typprüfung, sinnvolle Fehlermeldungen usw. durchführen und weitere Funktionen (möglicherweise Protokollierung?) Hinzufügen können.
Offensichtlich müssen Sie auch die entsprechende Definition der Funktion in das
.cpp
Datei in einen#ifdef _DEBUG
Block einschließen.quelle
Stellen Sie auf jeden Fall sicher, dass Sie nicht die von Ihrem Team vorgegebenen Code-Richtlinien befolgen. Stellen Sie sicher, dass kein anderer Code im System versucht, dieselbe Funktionalität über eine allgemeine if-Bedingung zu erreichen.
quelle