У меня есть (сгенерированная) литеральная строка в C ++, которая может содержать символы, которые необходимо экранировать, используя нотацию \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";
но это немного некрасиво. Итак, у меня есть три вопроса:
Когда это изменилось?
Почему компилятор не принимает> двухзначные шестнадцатеричные экранирования для широких строковых литералов?
Есть ли обходной путь, который менее неудобен, чем описанный выше?