Рассмотрим эти две строки:
wchar_t* x = L"xy\x588xla";
wchar_t* y = L"xy\x588bla";
После прочтения вы можете ожидать, что оба строковых литерала одинаковы, за исключением одного символа — 'x'
вместо 'b'
,
Оказывается, это не тот случай. Первая строка компилируется в:
y = {'x', 'y', 0x588, 'x', 'l', 'a' }
а второй на самом деле:
x = {'x', 'y', 0x588b, 'l', 'a' }
Они даже не одинаковой длины!
Да, 'b'
съедено шестнадцатеричным представлением ('\xNNN'
) персонаж.
По крайней мере, это может привести к путанице и незначительным ошибкам в написанных от руки строках (можно утверждать, что строки юникода не принадлежат телу кода)
Но более серьезная проблема, с которой я сталкиваюсь, связана с автоматически генерируемым кодом. Кажется, просто нет способа выразить это: {'x', 'y', 0x588, 'b', 'l', 'a' }
в виде буквенной строки, не прибегая к записи всей строки в шестнадцатеричном представлении, что является расточительным и нечитаемым.
Любая идея обойти это?
Какой смысл в таком поведении языка?
Простой способ — использовать конкатенацию строк строки времени компиляции, таким образом:
wchar_t const* y = L"xy\x588" L"bla";
Других решений пока нет …