2013-03-14 4 views
8

diese beiden Saiten vor:C/C++: Inherent Mehrdeutigkeit von „ Xnnn“ -Format in Literalzeichenfolgen

wchar_t* x = L"xy\x588xla"; 
wchar_t* y = L"xy\x588bla"; 

Nach der Lektüre dieses Sie, dass beide Stringliterale die gleiche, außer ein Zeichen sind erwarten - ein 'x' statt von einem 'b'.
Es stellt sich heraus, dass dies nicht der Fall ist. Der erste String kompiliert:

y = {'x', 'y', 0x588, 'x', 'l', 'a' } 

und das zweite ist eigentlich:

x = {'x', 'y', 0x588b, 'l', 'a' } 

Sie sind nicht einmal die gleiche Länge!
Ja, die 'b' ist aufgegessen von der Hex-Darstellung ('\xNNN') Zeichen.

Am allerwenigsten, könnte dies für in handgeschriebenen Zeichenkette Verwirrung und subtile Fehler verursacht (Sie die Unicode argumentieren könnten Strings im Code Körper gehört nicht)

Aber das ernstere Problem, und die einer, dem ich gegenüberstehe, ist in automatisch generiertem Code. Es scheint einfach keine Möglichkeit zu bestehen, dies auszudrücken: {'x', 'y', 0x588, 'b', 'l', 'a' } als eine literale Zeichenkette, ohne die ganze Zeichenkette in hexadezimale Darstellung zu schreiben, was verschwenderisch und unlesbar ist.

Irgendeine Idee von einem Weg um dies?
Was ist der Sinn in der Sprache, die so verhält?

+0

Aua, gerade in dieser lief in C. Zum Glück ist der VS2013 Compiler warnte mich, dass mein Hex-Zeichen-Wert außerhalb des ‚char‘ war Angebot. – Spike0xff

Antwort

14

Ein einfacher Weg ist Zeit Stringliteral Verkettung zu verwenden, kompilieren, also:

wchar_t const* y = L"xy\x588" L"bla";