1.1 Наборы символов
Обработка наборов символов исходного кода в C и родственных языках довольно сложна. Стандарт C обсуждает два набора символов, но на самом деле их по меньшей мере четыре.
Файлы, на вход подаваемые в CPP, могут быть в любом наборе символов. Первым действием CPP, ещё до поиска границ строк, является преобразование файла в набор символов, используемый для внутренней обработки. Этот набор называется исходным набором символов в соответствии со стандартом C. Он должен быть изоморфным ISO 10646, также известному как Unicode. CPP использует кодировку UTF-8 Unicode.
Наборы символов входных файлов указываются с помощью опции -finput-charset=.
Все действия предварительной обработки (предмет остальной части этого руководства) выполняются в исходном наборе символов. Если вы запросите текстовый вывод предварительного процессора с опцией -E, он будет в формате UTF-8.
После завершения предварительной обработки строковые и символьные константы преобразуются ещё раз в выполняемый набор символов. Этот набор символов находится под управлением пользователя; по умолчанию он равен UTF-8, совпадая с исходным набором символов. Широкие строковые и символьные константы имеют свой собственный набор символов, который не называется конкретно в стандарте. Опять же, он находится под управлением пользователя. По умолчанию это UTF-16 или UTF-32, какой из них подходит к типу wchar_t целевой машины в порядке байтов целевой машины.1 Восьмеричные и шестнадцатеричные последовательности обратного слэша не преобразуются; '\x12' имеет значение 0x12 независимо от текущего выбранного набора символов выполнения. Все остальные последовательности обратного слэша заменяются символом в исходном наборе символов, который они представляют, а затем преобразуются в набор символов выполнения, точно так же, как и неэкранированные символы.
В идентификаторах символы за пределами диапазона ASCII можно указывать только с помощью эскейпов ‘\u’ и ‘\U’, а не напрямую. Если указана строгая совместимость с ISO C90, например, с помощью опции -std=c90, или используется -fno-extended-identifiers, то эти эскейпы недопустимы в идентификаторах.
Примечания
UTF-16 не соответствует требованиям стандарта C для набора символов с широкими символами, но выбор 16-битного wchar_t закреплён в некоторых системах ABI, поэтому мы не можем это исправить.
Далее: Первоначальная обработка, Вверх: Обзор [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-7.5.0/cpp/Character-sets.html