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