У меня есть (сгенерированная) литеральная строка на С++, которая может содержать символы, которые нужно экранировать с помощью нотации \x
. Например:
char foo[] = "\xABEcho";
Однако g++ (версия 4.1.2, если это имеет значение) вызывает ошибку:
test.cpp:1: error: hex escape sequence out of range
Компилятор, по-видимому, рассматривает символы Ec
как часть предыдущего шестнадцатеричного числа (поскольку они выглядят как шестнадцатеричные цифры). Поскольку четырехзначное шестнадцатеричное число не будет соответствовать значению char
, возникает ошибка. Очевидно, что для широкого строкового литерала L"\xABEcho"
первым символом будет U + ABEC, а затем L"ho"
.
Кажется, это изменилось за последние несколько десятилетий, и я никогда не замечал. Я почти уверен, что старые компиляторы C рассмотрят только две шестнадцатеричные цифры после \x
и не будут выглядеть дальше.
Я могу подумать об одном обходном пути для этого:
char foo[] = "\xAB""Echo";
но это немного уродливо. Поэтому у меня есть три вопроса:
-
Когда это изменилось?
-
Почему компилятор не принимает > двухзначные шестнадцатеричные экраны для широкоформатных литералов?
-
Есть ли обходной путь, который менее неудобен, чем выше?