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
Kannst " " auch weglassen, nur sieht das Ergebnis unbefriedigend aus.
Es ist schlicht so, dass mehrere Strings direkt hintereinander
automatisch verkettet werden.
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
constchar*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.
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.
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:
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.
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 "*".
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.
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