allg. statische variablen + logger klasse



  • ok folgendes, ich hab mehrere singleton klassen in meinem projekt

    von dem was ich weiss ist es so dass statische variablen (in dem fall die instanzen der singleton klasse welche member der klassen selbst sind) nach "c++ standard" alle erst dann initialisiert werden sollten wenn sie zum ersten mal benutzt werden (bin mir aber nicht sicher mit der aussage)

    außerdem hab ich auch hier und da gelesen dass die initialisierungsreihenfolge bei statischen variablen keiner regel unterliegt, sie können also alle durcheinander initialisiert werden und auch alle einfach direkt beim start und nicht erst wenn sie benötigt werden (hängt schätze ich vom compiler ab)

    ich habe also eine log klasse welche ebenfalls ein singleton ist

    1. ist es sicher die log klasse bereits zum loggen zu verwenden innerhalb der konstruktoren von den anderen singleton klassen

    also darf ich davon ausgehen dass wenn der kompiler sieht ich benutze die statische logger instanz in der statischen SomeClass instanz und logger aber noch nicht initialisiert worden ist, dass er mir das ding zu dem zeitpunkt initialisiert?

    oder sollte man eher davon absehen den logger in diesen konstruktoren zu verwenden

    1. zu der log klasse selbst

    ich bin ziemlich unentschieden ob ich es auf diese art machen soll:
    a)

    #define DO_LOG
    #ifdef DO_LOG
    #define LOG(x) Log::Instance()->Log(x)
    #else
    #define LOG(x) //dont log
    #endif
    

    also die "klassische" (? -.-) art über ein macro

    oder
    b)

    class Log
    {
        inline void Log(const char *string)
        {
    #ifdef DO_LOG
            logfile << string;
    #endif        
        }
    };
    

    ich meine... im grunde müsste es ja genau dasselbe sein, die inline methode wird halt sowieso inline ersetzt (bzw sollte, wenns der compiler nicht macht ist es auch kein drama) und wenn DO_LOG nicht gesetzt ist steht nix da
    (die methode um sich die instanz der log klasse zu holen ist halt auch inline)

    genauso wie bei der makro variante

    ich tendiere ehrlich gesagt zu b) weil ich es für die hübschere lösung halte

    aber wäre generell daran interessiert ob jemand gute gründe für oder gegen eine der beiden varianten nennen kann



  • Log(GetFreeDiskSpace() + " Mem " + GetFreeMem());
    

    bei b wrid der innere teil ausgeführt bei a nicht

    Kameras in jeden Raum.
    Wer die Kloschüssel trifft hat nichts zu verbergen.


Anmelden zum Antworten