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