Escape Sequenz "\xhh" Bug im GCC???

OP Persönliche Seite #539521
Lesenswert?

Hallo,

ich habe einen eigenen Zeichensatz für mein GLCD erstellt und möchte nun 
konstante Strings anlegen. Für das 'ü' muss ich bei meinem Zeichensatz 
0x5d verwenden.
Will ich nun den String "Zurück" konstant im Flash abgelegen würde man 
ja schreiben:
1
char PROGMEM string[] = "Zur\x5Dck";

\x ist ja die Escape-Sequenz für einen HEX-Code, aber wieviele Stellen 
wertet der GCC als HEX aus?
Im obigen Beispiel scheint es so, als würde das c auch noch mit als 
HEX-Ziffer ausgewertet werden. Jedenfalls zeigt meine print-Funktion 
weder das korrekte 'ü' noch das darauf folgende 'c' an.

Schreibe ich
1
char PROGMEM string[] = "\x5D\x5D\x5D\x5D";
werden korrekt "üüüü" angezeigt.

Ist das nun ein Bug im GCC?

Laut ANSI-C sind das meiner Meinung nach nur 2 Ziffern:
http://www.liquifried.com/docs/useful/Cescapeseq.html

Gruß,
Dominik
#539609
Lesenswert?

Kaut K&R darf die Anzahl der Zeichen hinter \x beliebig lang sein. 
Allerdings darf dabei Müll rauskommen, wenn der Wert nicht mehr 
dargestellt werden kann (also z.B. wen der Wert nicht mehr in int 
passt).
Genau weiß ich es auch nicht, aber anscheined ist das korrekt was der 
Compiler macht.

Woher soll der Compiler bei "Zur\x5Dck"; wissen, ob das Hex Zeichen bei 
5, bei D oder beim c endet ?
Daher verwendet man um sicher zu gehen den Weg mit den mehreren "".
Gast #539624
Lesenswert?

ANSI: "Even if eight bits are used for objects that have type char , the 
construction '\x123' specifies an integer character constant containing 
only one character."

Hintergrund: Die Breite eines "chars" ist seitens ANSI nicht auf 8 Bits 
festgelegt. Die Interpretation eines Strings darf jedoch nicht davon 
abhängen, ob das nun 8, 9 oer 12 Bits sind.
Moderator Persönliche Seite #539650
Lesenswert?

Ich vermute, dass ANSI-C89 eigens dafür die `string concetanation',
also das automatische Verketten der Strings "abc" "def" zu "abcdef"
erfunden hat.  Das gab's davor (also es nur oktale ESC-Sequenzen
gab) nämlich noch nicht.  Ist aber auch für andere Dinge ganz nett,
z. B. kann man das dann auch etwas lesefreundlicher aufschreiben:
1
#define ue "\x5D"
2

3
...
4

5
  puts("Zur"ue"ck");

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