Forum: Compiler & IDEs String aus __TIME__ & __DATE__


von Peter (Gast)


Lesenswert?

Hallo!

Ich wollte gern in meiner Firmware einen String bzw. char-Array 
definieren, indem das Build-Datum &-Uhrzeit stehen.
Leider bekomme ich das mit dem Makros _TIME__ und __DATE_ nicht. hin.
Hab auch mit dem Glue-Befehl (##) probiert.

Weiß jemand, wie das geht?

Danke.

Gruß
Peter

von (prx) A. K. (prx)


Lesenswert?

Du denkst zu kompliziert ;-).

Da
1
 "a" "b"
 dem String "ab" entspricht, reicht sowas wie
1
 __DATE__ " " __TIME__
 bereits aus.

von Hc Z. (mizch)


Lesenswert?

Vielleicht schreibst Du erst, wo die Schwierigkeit liegt und warum Du 
ein „#“ zu benötigen glaubst.
1
const char date_and_time[] = __DATE__ " " __TIME__;

Blödsinnig ist dabei allenfalls das amerikanische Datumsformat, der Rest 
bietet keine Besonderheiten.

von Peter (Gast)


Lesenswert?

War wirklich einfacher als gedacht. Das man mit
1
" "
 die Strings zusammenfassen kann, war mir neu...

Danke.

von (prx) A. K. (prx)


Lesenswert?

Kannst " " auch weglassen, nur sieht das Ergebnis unbefriedigend aus.

Es ist schlicht so, dass mehrere Strings direkt hintereinander 
automatisch verkettet werden.

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> War wirklich einfacher als gedacht. Das man mit
1
" "
 die Strings
> zusammenfassen kann, war mir neu...
>


Das würde auch mit "+++" gehen oder mit "abcd" oder mit "hotzenplotz" 
oder mit "" ...

Punkt ist, das mehrere Strings die hintereinanderfolgen vom Compiler zu 
einem zusammengefasst werden.
Das ist besonders praktisch, wenn man einen sehr langen String im Editor 
so darstellen möchte, dass er auch ohne Verrenkungen im Editor lesbar 
wird
1
const char* HelpText = "Dies ist ein Helptext\n"
2
                       "Er geht über 2 Zeilen.\n"
3
                       "Optionen:\n"
4
                       "-h      zeige Help Text\n"
5
                       "-f      formatiere Platte\n";

> war mir neu...
Steht in jedem C-Buch. Soviel dazu was du alles noch nicht kennst.

von Klaus (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Steht in jedem C-Buch. Soviel dazu was du alles noch nicht kennst.

Naja, nicht alles was in einem C-Buch steht, muss man bis ins kleinste 
Detail auswendig wissen.  ;-)

Ich programmiere auch schon einige Jahre in C und kannte dieses Detail 
noch nicht. Habs bisher einfach nicht gebraucht. Vielleicht irgendwann 
mal gelesen und wieder vergessen.

Der Hinweis mit dem C-Buch ist dann doch eher bei fehlendem 
Grundlagenwissen angebracht.

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


Lesenswert?

Klaus schrieb:
> Ich programmiere auch schon einige Jahre in C und kannte dieses Detail
> noch nicht. Habs bisher einfach nicht gebraucht.

Wurde mit der 1989er Version eingeführt.  Nur auf diese Weise ist
es nämlich möglich, eine "\x"-Escapefolge zu beenden, wenn danach
gleich wieder eine Ziffer folgt.  "\x12345" würde nicht etwa
interpretiert als das Zeichen "\x12", gefolgt von "345", sondern
es würde interpretiert als String, bestehend aus einem Zeichen mit
dem Wert 0x12345 (der sicherlich alle gängigen Zeichensatzsysteme
überschreitet).  Das ist ein Unterschied zu oktalen Zeichen, die
spätestens nach der dritten Ziffer beendet wurden.

Der C89-Ausweg daraus war, dass man obigen String als "\x12" "345"
schreiben kann und muss.

Wo sich das Feature auch recht nett macht ist, wenn man bestimmte
Teile eines Strings als #define auslagern möchte.  Nehmen wir an,
du hast ein LCD an deinem Controller, das das Zeichen 'µ' in der
Zeichensatzposition 0x89 stehen hat, dann kannst du schreiben:
1
#define MY "\x89"
2
3
...
4
  printf("Kapazität: %f " MY "F", cap);

von Rolf Magnus (Gast)


Lesenswert?

Bei printf ist es vor allem praktisch, wenn man sich einen Typedef für 
z.B. einen Integer-Typ anlegt, aber irgendwo den Wert einer Variable 
dieses Typs mit printf ausgeben will. Da kann man nicht direkt sowas 
schreiben wie printf("Der Wert ist %d\n", wert); weil es ja ein Typ sein 
könnte, auf den %d nicht paßt. Also schreibt man sowas wie
printf("Der Wert ist %" MYTYPE_FORMAT "\n", wert"); und kann dann das 
MYTYPE_FORMAT da definieren, wo auch das typedef steht. Die 
C-Standardbibliothek macht das auch so, zumindest seit C99, z.B. die 
Typen uint*_t.

von Peter (Gast)


Lesenswert?

Ich kenne die Verknüpfung von Strings mit einem + (Plus-Zeichen).
Das habe ich ursprünglich Verwendet, aber das war eben nicht vom Erfolg 
gekrönt.
Und trennen tue ich jetzt _DATE_ & _TIME_ mit "*".

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


Lesenswert?

Peter schrieb:
> Ich kenne die Verknüpfung von Strings mit einem + (Plus-Zeichen).

C++, überladener Operator.

von Klaus (Gast)


Lesenswert?

Peter schrieb:
> Ich kenne die Verknüpfung von Strings mit einem + (Plus-Zeichen).

Ja, in C++. Weil dort ein String eine Klasse mit überladenem + Operator 
ist, welcher die Verkettung ausführt.

In C ist ein string jedoch nur ein char*. Und da das Addieren von 2 
Zeigern keinen Sinn macht, darf man auch kein + zwischen 2 Strings 
schreiben.

von Andreas F. (aferber)


Lesenswert?

Klaus schrieb:
>> Ich kenne die Verknüpfung von Strings mit einem + (Plus-Zeichen).
> Ja, in C++. Weil dort ein String eine Klasse mit überladenem + Operator
> ist, welcher die Verkettung ausführt.

Allerdings wird hier dann die Verkettung zur Laufzeit durchgeführt, 
während die Verkettung durch Hintereinanderschreiben (die auch in C++ 
geht) zur Compilezeit gemacht wird. und deshalb zur Laufzeit weder 
Speicher noch Zeit kostet.

Andreas

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.