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
Du denkst zu kompliziert ;-). Da
1 | "a" "b" |
dem String "ab" entspricht, reicht sowas wie
1 | __DATE__ " " __TIME__ |
bereits aus.
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.
War wirklich einfacher als gedacht. Das man mit
1 | " "
|
die Strings zusammenfassen kann, war mir neu... Danke.
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 | 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.
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:
1 | #define MY "\x89"
|
2 | |
3 | ...
|
4 | printf("Kapazität: %f " MY "F", cap); |
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). C++, überladener Operator.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.