2 Stimmen

Wie kann man eine Methode ausschließen, wenn das Kompilierungssymbol nicht gesetzt ist? Wie kann man eine variable Anzahl von Parametern übergeben und sie im Funktionskörper formatieren?

Ich habe meine eigene einfache Klasse für die Protokollierung geschrieben. Ich verstehe, dass ich besser, eine Art von Bibliothek (boost.log, log4cpp?) zu verwenden, aber lassen Sie uns trotzdem meine einfache Klasse diskutieren:

#include "stdafx.h"
#include "Logger.h"

Logger::Logger(std::string fileName)
{
    logFile.open(fileName);
}

Logger::~Logger(void)
{
    logFile.close();
}

void Logger::Error(std::string message) {
    logFile << message << std::endl;
}

void Logger::Debug(std::string message) {
    logFile << message << std::endl;
}
  1. Ich möchte, dass meine Methoden eine variable Anzahl von Argumenten akzeptieren, so dass ich Parameter wie diese übergeben kann "Error code: %x", code . Wie kann man das tun?
  2. Ich möchte Debug Methode ausgeschlossen werden, wenn LOG_DEBUG Kompilierungssymbol nicht gesetzt ist. In C# kann ich einfach hinzufügen [Conditional("LOG_DEBUG")] vor der Deklaration der Methode, aber wie soll man das in C++ machen?

update Zu 1: Das habe ich ausprobiert und es funktioniert:

void Logger::Debug(std::string message, ...) {
va_list arglist;
fprintf(pFile, message.c_str(), arglist);

5voto

Some programmer dude Punkte 377919

Am einfachsten ist es meiner Meinung nach, dafür Makros zu verwenden:

#define LOG_DEBUG(logger, output) \
    do { logger.getStream() << "DEBUG: " << output << std::endl; } while (0)

LOG_DEBUG(logger, "Some value = " << some_value);

Dadurch können Sie alle normalen C++-Stream-Manipulatoren verwenden.


Was den zweiten Teil betrifft, so handelt es sich ebenfalls um einen einfachen Präprozessor-Trick:

#ifdef DEBUG
# define LOG_DEBUG(logger, output) do { ... } while (0)
#else
# define LOG_DEBUG(logger, output)
#endif

4voto

utnapistim Punkte 25960

Ich möchte, dass meine Methoden eine variable Anzahl von Argumenten akzeptieren, so dass ich Parameter wie "Fehlercode" übergeben kann: %x", Code. Wie kann ich das tun?

Hierfür gibt es zwei Lösungen:

  1. eine printf-ähnliche Formatierung verwenden. Dies würde die Verwendung der Makros va_list, va_arg und va_end erfordern.

  2. Operatorüberladung verwenden (wie in der Antwort von @Joachim).

Ich möchte Debug-Methode ausgeschlossen werden, wenn LOG_DEBUG Kompilierungssymbol nicht festgelegt ist. in C# kann ich nur hinzufügen, [Conditional("LOG_DEBUG")] vor der Methodendeklaration, aber jetzt zu tun, dass in C++?

Sie definieren ein Protokollierungsmakro auf zwei verschiedene Arten, abhängig von der Definition des DEBUG-Makros (oder NDEBUG oder etwas Ähnlichem):

#ifdef DEBUG
#define LOGE(X) Logger::Error(X)
#define LOGD(X) Logger::Debug(X)
#else
#define LOGE(X) 
#define LOGD(X) 
#endif

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X