Почему вставка знака евро внутри строковый литерал, использующий UTF8, не создает UCN?

В спецификации сказано, что на этапе 1 компиляции

любой символ исходного файла, не входящий в базовый набор исходных символов (2.3), заменяется универсальным-символьным-именем, которое обозначает этот символ.

И на этапе 4 он говорит

Директивы предварительной обработки выполняются, вызовы макросов расширяются

На этапе 5 у нас есть

Каждый элемент исходного набора символов в символьном литерале или строковом литерале, а также каждая escape-последовательность и универсальное имя-символа в символьном литерале или необработанном строковом литерале преобразуется в соответствующий член набора символов выполнения

Для оператора # мы имеем

символ \ вставляется перед каждым символом " и \ символьного литерала или строкового литерала (включая ограничивающие символы " ) .

Поэтому я провел следующий тест

#define GET_UCN(X) #X
GET_UCN("€")

С входным набором символов UTF-8 (совпадающим с кодировкой моего файла) я ожидал следующего результата предварительной обработки операции #X : "\" \\ u20AC \ "" . GCC, Clang и boost.wave не преобразуют в UCN, а вместо этого выдают "\" € \ "" . Я чувствую, что что-то упускаю. Не могли бы вы объяснить?

7
задан Brian Tompsett - 汤莱恩 21 June 2016 в 22:19
поделиться