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