Forum: Compiler & IDEs Compilezeit und -datum als Integer, ähnlich __DATE__


von heiner (Gast)


Lesenswert?

Gibt es eine Möglichkeit, Compilezeit/-datum zur Compilezeit als 
Konstante zu erhalten? Als String ist das Ganze leider volliger Overkill 
und verbraucht zu viel Speicher. Ich brauche eigentlich nur einen 
simplen Timestamp, wie ihn der Compiler ja irgendwo haben muss. Nur, wie 
komme ich da ran?

von (prx) A. K. (prx)


Lesenswert?

In den Übersetzungsprozess ein Include-File einbauen, das jedes Mal neu 
erzeugt wird und nur ebendies enthält.

von heiner (Gast)


Lesenswert?

Wovon erzeugt? Sowas (Timestamp) müsste eigentlich eine 
Compiler-Grundfunktion sein. Ich kann den ja nicht jedesmal manuell 
eintragen.

von (prx) A. K. (prx)


Lesenswert?

heiner schrieb:
> Wovon erzeugt?

Programm/Script deiner Wahl.

> Sowas (Timestamp) müsste eigentlich eine
> Compiler-Grundfunktion sein.

Ein Linker pflegt sowas gern im Binary zu hinterlassen. Aber weshalb der 
Compiler? In Textform tut er es ja, aber weshalb sollte er es bloss 
deinetwegen anders machen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

A. K. schrieb:
> Ein Linker pflegt sowas gern im Binary zu hinterlassen.

COFF hatte mal die Schnapsidee eines Zeitstempels, aber der wurde
praktisch nicht benutzt (die Information wird ja bereits im Dateisystem
festgehalten), und ELF hat es gar nicht erst übernommen.

von heiner (Gast)


Lesenswert?

Puh, also zu allererst ist ein Timestamp universell, kompatibel, lässt 
sich ohne Aufwand umrechnen, ...

von g457 (Gast)


Lesenswert?

> Puh, also zu allererst ist ein Timestamp universell, kompatibel, lässt
> sich ohne Aufwand umrechnen, ...

Dafür wurde die RFC 3339 erfunden.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

heiner schrieb:
> Puh, also zu allererst ist ein Timestamp universell, kompatibel, lässt
> sich ohne Aufwand umrechnen, ...

Leider wissen wir nicht so recht, wann unser Universum genau entstanden
ist (Urknall), folglich haben wir keinen bekannten Fixpunkt für einen
Zeitstempel (anders als bspw. die Temperatur).

Alle anderen Bezugssysteme reichen nur eine mehr oder minder endliche
Zeit zurück und haben damit zumindest gegenseitige Offsets, die man
verwalten muss, egal, ob man das nun an der Geburt eines Propheten,
dem Erscheinen eines Betriebssystems oder was auch immer festmacht.

Finde dich einfach damit ab, dass du dir einen Zeitstempel in der
Skalierung deiner Wahl selbst organisieren musst.

von gnd3 (Gast)


Lesenswert?

moin, moin,

mir reicht ein Timestamp für das komplette Programm, also nicht einer 
pro Quell-Datei. Den kann (sollte) der Linker einbauen. Dazu gibt's im 
Makefile zwei Zeilen:
1
NOW= `date +%s`
2
CFLAGS= -Wl,-defsym=BUILD_TIME=$(NOW)

im Programm gibt's dann diese seltsame Konstruktion, aber im Endeffekt 
kann ich den Zeitpunkt des make-Aufrufs ganz normal verwenden:
1
extern int  BUILD_TIME;
2
time_t  build_time = (time_t)&BUILD_TIME;

Ich würde aber auch eine elegantere Methode verwenden ;)

von Dr. Sommer (Gast)


Lesenswert?

Ins makefile:
1
gcc -D_BUILD_TIME=`date +%s`
In eine zentrale Headerdatei oder jede .c Datei:
1
extern const time_t BUILD_TIME;
In eine .c Datei:
1
const time_t BUILD_TIME = _BUILD_TIME;
So kann von jeder Stelle im Code "BUILD_TIME" als 
Programmspeicher-Konstante verwendet werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.