c++ Dateilogger



  • ups.. da war ich wohl zu langsam ;-).
    @tntnet:
    ich denke dein Beispiel reicht, wenn ich da auch mehrere Werte verknüpfen kann, Danke. Um dein Beispiel zu Verwenden:

    DBG("Der Wert für Variable a ist " << 5 << " B ist " << 6);
    

    würde das damit gehn?



  • Ok, vielen Dank an Alle, das Beispiel von tntnet war im Prinzip genau das was ich gesucht habe. Hier nochmal ein komplettes Beispiel als Pendant zur C Implementierung:

    #include <iostream>
    #include <fstream>
    #include <time.h>
    
    bool debug_enabled = true;
    std::ofstream logfile;
    
    #define DBG(expr) \
      do { if (debug_enabled) logfile << time(NULL) << ": " << expr << std::endl; } while (false) 	
    
    int main()
    {
    	logfile.open("ausgabe.txt");
    	if(!logfile) {
    		std::cout << "open logfile failed" << std::endl;
    		return -1;
    	}
    
    	DBG("Der Wert für Variable a ist " << 5 << " B ist " << 6);
    
    	logfile.close();
    
    	return 0;
    }
    

    Gruß, Kekso



  • Darf ich fragen, wozu die Schleife mit der Bedingung while(false) nötig ist? Sie wird ja eh nur einmal ausgeführt, dann kann man sie ja auch weglassen, oder?

    Man lernt ja nie aus 😃



  • Ja, das wird benötigt, damit du die Anweisung auch in geschachtelten if()- und Schleifen-Strukturen einsetzen kannst, ohne deinen Programmfluß durcheinanderzubringen (der Präprozessor ersetzt blind - also würde er das else zu dem if(debug_enables) zuordnen:)

    if(mymap.find(val)!=mymap.end())
      DBG("Wert gefunden");
    else
      DBG("nichts gefunden");
    


  • Was müsste ich den eigentlich tun damit dieses Makro auch über eine Funktion abbildbar ist?

    void debugMsg([Datentyp???] expr){
    	if (debug_enabled) 
    		logfile << time(NULL) << ": " << expr << std::endl; 	
    }
    

    Kekso



  • Okay danke, wieder was gelernt ^^



  • @kekso
    Mach ein template draus.

    template<typename T>
    void debugMsg(const T& expr){
        if (debug_enabled)
            logfile << time(NULL) << ": " << expr << std::endl;    
    }
    


  • ok, aber das funktioniert nur für einen Parameter. Bei einer Liste wie

    debugMsg("Der Wert für Variable a ist " << 5 << " B ist " << 6);
    

    aber leider nicht.



  • Bei dem Makro so direkt aber auch nicht, es sei denn man verwendet derartige Makroargumente

    DBG(a << b << c)
    

    Du könntest dir pro Anzahl der Parameter eine neue Funktion überladen.



  • 🙂 ok das wäre möglich, aber nicht wirklich praktikabel. Aber trotzdem Danke


Anmelden zum Antworten