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?
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