boost::date_time und statische Initialisierung



  • Eine Programmstartzeit bei der ersten Verwendung zu initialisieren, macht irgendwie wenig Sinn 😃

    @noprob: Dazu bräuchte ich kein Singleton. Dennoch wollte ich es vermeiden, einen Aufruf in main schreiben zu müssen.



  • @Tachyon: Vielen vielen Dank, genau das war das Problem! Ich habe die Variable in einer anderen Übersetzungseinheit verwendet. Nun brauche ich noch eine Lösung dafür...

    Ich verwende einen globalen std::ofstream, in den Logs geschrieben werden. Der Dateiname soll die Startzeit des Programms beinhalten. Vorschläge?



  • 314159265358979 schrieb:

    Vorschläge?

    Du mußt es noch ein wenig komplizierter machen. Dann geht's auf einmal. Bestimmt. Versprochen!



  • Könntest du bitte konkreter werden?



  • 314159265358979 schrieb:

    Eine Programmstartzeit bei der ersten Verwendung zu initialisieren, macht irgendwie wenig Sinn 😃

    Kommt drauf an. Wenn die erste Verwendung erst sehr spät geschieht, ist das natürlich sinnlos, aber offenbar hattest du ja eher das Problem, dass die erste Verwendung schon vor der Initialisierung geschieht udn damit vor dem, was du als "Programmstartzeit" festgelegt hast.

    Vielleicht wäre eine Kombination aus beidem sinnvoll: initlaize on first use, und diesen "first use" mit der Initialisierung einer statischen/globalen variablen "sehr früh" im Programm sicherzustaellen.



  • 314159265358979 schrieb:

    Eine Programmstartzeit bei der ersten Verwendung zu initialisieren, macht irgendwie wenig Sinn 😃

    Ähm. Er wünschte doch nur, daß bei der ersten Verwendung initialisiert wird. Damit jemand, der zufällig vor Dir kommt, eben schnell vor Die initialisiert. Und Du kannst dann auch vor der main() global mal schnell verwenden, und schon haste die Startzeit. Und wenn Dir ein anderes globales Objekt zuvorkommt, ist die Startzeit halt früher. Ganz im Sinne des Erfinders.



  • Damit fange ich immer noch wenig an. 😕



  • Tachyon schrieb:

    Benutzt Du den Wert evtl. in globalen Variablen in anderen Übersetzungseinheiten?

    Wieso tritt denn das Problem auf, wenn man die globale Variable in einer anderen Übersetzungseinheit verwendet?

    Würde es dann nicht funktionieren, wenn man in der gleichen Übersetzungseinheit einfach eine getter macht und darüber zugreift?



  • Versuchs mal so:

    std::string const& startup_time()
    {
        static std::string const stime(current_time()); 
        return stime;
    }
    
    //...
    
    int main()
    {
        //gleich beim Eintritt einmal...
        startup_time();
    }
    

    Ich weiß, dass das nicht sehr schön ist, aber es ist vermutlich die sicherste Variante für das, was DU haben willst.



  • Nachgefragt... schrieb:

    [...]Wieso tritt denn das Problem auf, wenn man die globale Variable in einer anderen Übersetzungseinheit verwendet[...]

    Lies mal das hier.



  • Nachgefragt... schrieb:

    Tachyon schrieb:

    Benutzt Du den Wert evtl. in globalen Variablen in anderen Übersetzungseinheiten?

    Wieso tritt denn das Problem auf, wenn man die globale Variable in einer anderen Übersetzungseinheit verwendet?

    Tritt nur auf, wenn man in der anderen ÜE ebenfalls durch diesen Trick Code vor der main() ausführt.
    Dann ist eben nach Standard nicht definiert, welcher Code zuerst ausgeführt wird.
    Zum Beispiel, wenn der Konstruktor des globalen LogFiles diesen globalen String mit der Startzeit lesen will.



  • Danke, habs nun hinbekommen 🙂



  • Tachyon schrieb:

    Nachgefragt... schrieb:

    [...]Wieso tritt denn das Problem auf, wenn man die globale Variable in einer anderen Übersetzungseinheit verwendet[...]

    Lies mal das hier.

    Aah... Wer lesen kann ist klar im Vorteil

    volkard schrieb:

    Nachgefragt... schrieb:

    Tachyon schrieb:

    Benutzt Du den Wert evtl. in globalen Variablen in anderen Übersetzungseinheiten?

    Wieso tritt denn das Problem auf, wenn man die globale Variable in einer anderen Übersetzungseinheit verwendet?

    Tritt nur auf, wenn man in der anderen ÜE ebenfalls durch diesen Trick Code vor der main() ausführt.
    Dann ist eben nach Standard nicht definiert, welcher Code zuerst ausgeführt wird.
    Zum Beispiel, wenn der Konstruktor des globalen LogFiles diesen globalen String mit der Startzeit lesen will.

    Danke euch beiden...
    👍 👍 👍


Anmelden zum Antworten