String aus __TIME__ & __DATE__

Gast #1735831
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
#1735842
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.
#1738245
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.
Gast #1738272
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.
Moderator Persönliche Seite #1738291
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);
Gast #1738336
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.
Gast #1738433
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 "*".
Gast #1738442
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.
#1738695
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren