C / C ++: Неопределенность, присущая & quot; \ xNNN & quot; формат в буквальных строках

Рассмотрим эти две строки:

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' } в виде буквенной строки, не прибегая к записи всей строки в шестнадцатеричном представлении, что является расточительным и нечитаемым.

Любая идея обойти это?
Какой смысл в таком поведении языка?

8

Решение

Простой способ — использовать конкатенацию строк строки времени компиляции, таким образом:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]