Когда компиляторы C ++ начали учитывать более двух шестнадцатеричных цифр в escape-символах строковых литералов?

У меня есть (сгенерированная) буквальная строка в 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-последовательности для широких строковых литералов?

  • Есть ли обходной путь, который ' менее неудобно, чем указано выше?

55
задан Greg Hewgill 25 April 2011 в 14:22
поделиться