Ich versuche, Protokollierung zu implementieren, die keinen Overhead erzeugen, wenn nicht benötigt (d. H. Kein Methodenaufruf sollte überhaupt durchgeführt werden). Ich möchte keinen Overhead, weil es Code mit niedriger Latenz ist. Habe ich nur noch #define ENABLE_LOGS
meine Header-Klasse und jetzt sieht es so aus, dass (Sie können Details ignorieren)einfach wegwerfen C++ Anruf vollständig
#pragma once
#include <string>
#include <fstream>
#define ENABLE_LOGS
namespace fastNative {
class Logger
{
public:
Logger(std::string name_, std::string fileName, bool append = false);
~Logger(void);
void Error(std::string message, ...);
void Debug(std::string message, ...);
void DebugConsole(std::string message, ...);
void Flush();
static Logger errorsLogger;
static Logger infoLogger;
private:
FILE* logFile;
bool debugEnabled;
};
}
Jedes Mal, ich brauche eine Methode verwenden ich es so, umgeben sollte:
#ifdef ENABLE_LOGS
logger.Debug("seq=%6d len=%4d", seq, length_);
#endif
Es ist error-phrone (ich kann vergessen zu umgeben) und macht den Code schmutzig. Kann ich meinen Code irgendwie reparieren, um nicht jedesmal #ifdef
zu verwenden?
In C# mag ich Conditional Ich denke, ich brauche so etwas für C++.
Finden Sie eine assert.h - auch die unter http://StackOverflow.com/questions/9701229/c-assert-implementation-in-assert-h für ein Beispiel, wie Sie Code machen, den Sie ausschalten können eine Flagge an einem Ort. –
Sie können die Debug-Methode "define" definieren, um eine ('inline') leere Implementierung im Header zu haben. Verlassen Sie sich dann auf das Optimierungsprogramm, um Funktionsaufrufe zu entfernen, die nichts tun (dies setzt voraus, dass Argumente keine Nebenwirkungen haben). Der traditionellere Weg besteht darin, Präprozessormakros direkt zu verwenden, was direkter ist, aber etwas fehleranfälliger sein kann. – Cameron
Ich gehe davon aus, dass die Argumente auch nicht ausgewertet werden sollen. Dies verkompliziert die Dinge erheblich, wenn Sie ein sauberes C++ Aussehen wünschen. Zeit für einige Makros! –