2013-03-14 10 views
8

Rozważmy te dwa ciągi:C/C++: Nieodłącznym niejednoznaczność formacie „ Xnnn” w dosłownym ciągów

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

po przeczytaniu tego można oczekiwać, że oba literały ciągów znaków są takie same, z wyjątkiem jednego znaku - W 'x' zamiast z 'b'.
Okazuje się, że tak nie jest. Pierwszy ciąg kompiluje do:

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

a drugi jest w rzeczywistości:

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

Oni nie są nawet taką samą długość!
Tak, 'b' jest zjedzony przez znak heksadecymalny ('\xNNN').

Przynajmniej, może to spowodować zamieszanie i subtelne błędy w odręcznymi strun (można argumentować, że unicode ciągi nie należą w organizmie code)

ale bardziej poważny problem, a jeden, przed którym stoję, jest w generowanym automatycznie kodzie. Wydaje się, że nie ma żadnego sposobu na wyrażenie tego: {'x', 'y', 0x588, 'b', 'l', 'a' } jako ciąg literowy bez uciekania się do pisania całego ciągu w reprezentacji heksowej, co jest marnotrawstwem i nieczytelnością.

Masz pomysł na obejście tego?
Jaki jest sens w języku zachowującym się w ten sposób?

+0

Ała, po prostu wpadł na to w C. Na szczęście kompilator VS2013 ostrzegł mnie, że moja wartość znaków hex był poza „char” zasięg. – Spike0xff

Odpowiedz

14

Prostym sposobem jest użycie kompilacji ciąg dosłownego konkatenacji, a więc:

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