Как указано в C 2018 5.1.1.2 1, перевод C происходит в 8 этапов, упрощенно здесь:
- Символы в исходном файле отображаются в исходный набор символов в соответствии с реализацией.
- Если обратные косые черты обозначают непрерывные линии, линии соединяются вместе.
- Исходный файл сгруппирован в токены предварительной обработки и последовательности пробелов.
- Выполнены директивы предварительной обработки.
- Символы в символьных константах и строковых литералах преобразуются из исходного набора символов в набор символов выполнения.
- Смежные строковые литералы объединяются.
- Токены предварительной обработки преобразуются в токены и анализируются синтаксически и семантически.
- Разрешены ссылки на внешние объекты и функции.
Проблема, с которой вы сталкиваетесь, заключается в основном в фазе 3. Замена макроса не работает на основе текста или символа; он заменяет токены предварительной обработки, а не символы. Таким образом, вы не можете заменить «some_korean» на кавычку. Даже если «some_korean» распознается как токен предварительной обработки, кавычка - нет, и поэтому он не может быть токеном предварительной обработки в данных замены макроса.
Кроме того, какие строки вы можете обозначить как «some_korean», может быть проблематично. Чтобы служить именем макроса, это должен быть идентификатор в грамматике. Идентификатором является идентификатор-нецифровый символ, за которым следует любое количество либо идентификатор-нецифровый или цифра символов (которые являются от «0» до «9»). идентификатор без цифры - это без цифры (подчеркивание, от «a» до «z» или от «A» до «Z»), имя универсального символа (более подробно описано в Приложении D к стандарту C) или любые символы, определяемые реализацией для этой цели.
Корейские символы, по-видимому, включены в значения universal-symbol-name , перечисленные в Приложении D, поэтому их использование в идентификаторах должно быть приемлемым, если только вы не используете некоторые ненормальные символы вне указанных значений. Однако заменяющий текст для каждого макроса должен состоять из надлежащих токенов препроцессора, которые включают целые строки и символьные константы, но не включают отдельные символы кавычек.