__TIMESTAMP__ liefert falsches Datum



  • Hi!
    Ich benutze das präprozessor-Makro "__TIMESTAMP__" um das Builddatum in eine Datei zu schreiben. Blöderweise stimmt das Datum was da drin manchmal einfach nicht. Ich habe z.b. heute kompiliert 24.5, aber in __TIMESTAMP__ steht dann irgendwie Montag, der 23.5. Keine Ahnung warum. Die Uhr meines Rechenrs stimmt.

    Hat da jemand eine Ahnung warum das so ist?

    Gruß



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum Linux/Unix in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    RTFM.





  • Das Datum und die Uhrzeit der letzten Änderung der aktuellen Quelldatei

    Ist nicht ganz eindeutig. Aber ich verstehe darunter, dass __TIMESTAMP__ den Zeitpunkt des letzten Kompilats beschreibt. Aber dann kann es ja nicht sein, dass sich Quellcode und in Folge dessen auch die Binärdatei ändern, aber das Datum dann nicht.

    Oder sehe ich das falsch?



  • SchlitzInDaHaus schrieb:

    Das Datum und die Uhrzeit der letzten Änderung der aktuellen Quelldatei

    Ist nicht ganz eindeutig.

    Doch, ist es.

    Aber ich verstehe darunter, dass __TIMESTAMP__ den Zeitpunkt des letzten Kompilats beschreibt.

    Das steht da aber nicht.



  • Also arrogant seid ihr gar nicht oder? Mein lieber SeppJ und SG1?

    SeppJ schrieb:

    RTFM.

    Um eine Korrekte Zuordnung vor zu nehmen, bedarf es Vorwissen, dass das Thema Präprozessor nicht C++ zuzuordnen ist, sondern einer anderen Kategorie. Der Präprozessor wird wie der Name schon sagt vorm Compiler aufgerufen. Da es aber keine solche Kategorie in eurem geilen Manual gibt, hab ich die Kategorie gewählt, in der ich programmiere. C++. Wenn ich alles wüsste müsste ich hier nicht nachfragen. Wenn man davon ausgeht, dass ich nicht alles weiß, ist der Kommentar von oben unangebracht.

    Insofern: STFU

    Nächster: SG1

    SG1 schrieb:

    SchlitzInDaHaus schrieb:

    Das Datum und die Uhrzeit der letzten Änderung der aktuellen Quelldatei

    Ist nicht ganz eindeutig.

    Doch, ist es.

    Wenn ich 20 Quelldateien habe, welche ist dann die aktuelle. Insofern: Nein.
    Wenn meine Quelldatei das Änderungsdatum von heute hat, warum ist das Datum im Makro dann gestern?

    SG1 schrieb:

    SchlitzInDaHaus schrieb:

    Aber ich verstehe darunter, dass __TIMESTAMP__ den Zeitpunkt des letzten Kompilats beschreibt.

    Das steht da aber nicht.

    Ja und was hergott nochmal steht DANN da? Vielleicht lässt du mich an deiner Weißheit teilhaben, und
    sagst mir, was dann dann sinngemäß steht, wenn das so eindeutig ist.

    Du hast ganze 8 Wörter geschrieben. Geholfen hats du mir damit 0.



  • SchlitzInDaHaus schrieb:

    Ja und was hergott nochmal steht DANN da? [...]

    MSDN ausm Link von oben schrieb:

    __TIMESTAMP__
    Das Datum und die Uhrzeit der letzten Änderung der aktuellen Quelldatei, ausgedrückt als Zeichenfolgenliteral im Format Ddd Mmm Date hh🇲🇲ss yyyy, wobei Ddd für den abgekürzten Wochentag steht und Date für eine ganze Zahl zwischen 1 und 31.

    und mit "aktuell" ist jeweils die gemeint, in der das Makro verwendet wird.

    Du bist wahrscheinlich auf der Suche nach __DATE__ und __TIME__ ...



  • Ich fasse kurz das wichtigste zusammen, was so auch im Manual steht:

    - __TIMESTAMP__ gibt den Zeitpunkt der letzten Änderung der Datei aus
    - bei der Datei handelt es sich um ein einziges File und zwar das in dem das Makro verwendet wird (meinetwegen "Spieler.cpp"
    - Erst wenn du aktiv eine Änderung in der Datei vornimmst und diese speicherst wird ein anderes Datum erzeugt



  • Swordfish schrieb:

    Du bist wahrscheinlich auf der Suche nach __DATE__ und __TIME__ ...

    Ja. Da hab ich dann Datum und Zeit einzeln. Aber dann ja auch wieder nur für die Datei, die zuletzt geändert wurde.

    inflames2k schrieb:

    Ich fasse kurz das wichtigste zusammen, was so auch im Manual steht:

    - __TIMESTAMP__ gibt den Zeitpunkt der letzten Änderung der Datei aus
    - bei der Datei handelt es sich um ein einziges File und zwar das in dem das Makro verwendet wird (meinetwegen "Spieler.cpp"
    - Erst wenn du aktiv eine Änderung in der Datei vornimmst und diese speicherst wird ein anderes Datum erzeugt

    Ja danke! Das passt dann zur Beobachtung.

    Was ich bräuchte halt ein Makro, welches den Zeitpunkt der Kompilierung des Gesamtprodukts festhält. Der Zeitpunkt soll hat für das Projekt gelten, um die Version im Workflow eindeutig zu identifizieren..



  • SchlitzInDaHaus schrieb:

    Swordfish schrieb:

    Du bist wahrscheinlich auf der Suche nach __DATE__ und __TIME__ ...

    Ja. Da hab ich dann Datum und Zeit einzeln. Aber dann ja auch wieder nur für die Datei, die zuletzt geändert wurde.

    Irgendwann reichts. RTFM!



  • Hä? Also irgendwas stimmt hier nicht. Ich bin mir nicht sicher ob's an mir liegt...

    Was ich brauchte ist: Den Zeitpunkt der Kompilierung des gesamten Projekts. Wie kriege ich das. Wenn das in dem Link steht, sehe ich es nicht.


  • Mod

    SchlitzInDaHaus schrieb:

    Hä? Also irgendwas stimmt hier nicht. Ich bin mir nicht sicher ob's an mir liegt...

    Alles Geisterfahrer, außer mir...



  • Ich finds nicht gut, was hier abgeht, aber ich steig mal drauf ein:

    Steht das was ich suche in dem Link?



  • Es kann diese Info "Zeitpunkt der Kompilierung des gesamten Projekts" als Präprozessor-Makro gar nicht geben, denn eine EXE wird aus einzelnen Objektdateien zusammengelinkt (und jede Objektdatei wird aus der entsprechenden Übersetzungseinheit (ÜE) erzeugt).
    Du müßtest von deinem Buildprozess her definieren, daß dann eine bestimmte ÜE immer neu erzeugt wird, sobald du eine neue EXE erzeugst.



  • Es ist mir im grunde egal ob es ein Makro oder sonstwas ist. Ich will ja einfach nur, dass sich eine Änderung der Codebasis in einer Änderung des Buildzeitpunktes niederschlägt.


  • Mod

    Dann darf diese Information logischerweise erst in der letzten Station des Buildprozesses eingepflegt werden. Das ist in der Regel das Linken. Jeder übliche Linker bietet die Möglichkeit, via Kommandozeile direkt Symbole zu definieren. Dann setzt du den Wert dieses Symbols auf die aktuelle Uhrzeit und fertig.

    Fürs nächste Mal bitte folgendes durchlesen und zu Herzen nehmen, anstatt eine Seite lang über die richtige Benutzung von __TIMESTAMP__ zu diskutieren, wenn dein Problem ein ganz anderes ist:
    http://www.perlmonks.org/?node_id=542341

    PS: In Erwartung offensichtlicher Folgefragen ein Minimalbeispiel:

    #include <time.h>
    #include <stdio.h>
    
    extern char TIMESTAMP;
    
    int main()
    {
      time_t timestamp = (time_t) &TIMESTAMP;
      printf("%s", ctime(&timestamp));
    }
    
    gcc -Wl,--defsym,TIMESTAMP=`date +%s` test.c
    

    Auf andere System, Sprachen oder Buildumgebungen bekommst du das selber angepasst.



  • Eine
    build.h

    #define BUILD_DATE_TIME __DATE__" "__TIME__
    

    build.cpp

    #include "build.h"
    

    mit einem Custom Pre-Build Step der build.obj löscht oder

    __TIMESTAMP__ wenn der Pre-Build Step das File touch ed (Windows: copy file /B+ ,,/Y ) wär auch noch möglich gwesn.


Log in to reply