11.1 Определяемое реализацией поведение
Вот как CPP ведет себя во всех случаях, которые стандарт C описывает как определяемое реализацией. Это означает, что реализация свободна делать, что ей заблагорассудится, но должна задокументировать свой выбор и придерживаться его.
- Сопоставление многобайтовых символов физического исходного файла с набором символов выполнения.
Набор символов ввода может быть задан с помощью опции -finput-charset, а набор символов выполнения может быть контролируем с помощью опций -fexec-charset и -fwide-exec-charset.
- Символы идентификаторов.
Стандарты C и C++ позволяют идентификаторам состоять из ‘_’ и буквенно-цифровых символов. C++ также допускает универсальные имена символов. Стандарты C99 и более поздние стандарты C допускают как универсальные имена символов, так и определяемые реализацией символы.
GCC допускает символ ‘$’ в идентификаторах в качестве расширения для большинства целевых платформ. Это справедливо независимо от переключателя std=, поскольку это расширение не может вступать в конфликт с программами, соответствующими стандартам. Однако при предварительной обработке ассемблера доллары по умолчанию не являются символами идентификаторов.
В настоящее время целевые платформы, которые по умолчанию не допускают ‘$’, — это AVR, IP2K, MMIX, MIPS Irix 3, ARM aout и целевые платформы PowerPC для операционной системы AIX.
Вы можете переопределить значение по умолчанию с помощью -fdollars-in-identifiers или fno-dollars-in-identifiers. См. fdollars-in-identifiers.
- Непустые последовательности пробельных символов.
В текстовом выводе каждая последовательность пробельных символов сводится к одному пробелу. По эстетическим соображениям, первый токен каждой строки вывода, не являющейся директивой, предваряется достаточным количеством пробелов, чтобы он отображался в той же колонке, что и в исходном файле.
- Численное значение символьных констант в выражениях препроцессора.
Препроцессор и компилятор интерпретируют символьные константы одинаково; т.е. escape-последовательности, такие как ‘\a’, получают значения, которые они имели бы на целевой машине.
Компилятор оценивает многосимвольную символьную константу по одному символу за раз, сдвигая предыдущее значение влево на количество битов на символ целевой платформы, а затем выполняем операцию поразрядного ИЛИ с битовым представлением нового символа, усеченным до ширины символа целевой платформы. Конечное битовое представление имеет тип
int, и поэтому является знаковым, независимо от того, являются ли отдельные символы знаковыми или нет. Если в константе больше символов, чем может вместить целеваяint, компилятор выдает предупреждение, а избыточные начальные символы игнорируются.Например,
'ab'для целевой платформы с 8-битнымcharинтерпретировалось бы как ‘(int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')’, а'\234a'как ‘(int) ((unsigned char) '\234' * 256 + (unsigned char) 'a')’. - Включение исходных файлов.
Обсуждение того, как препроцессор находит заголовочные файлы, см. в разделе Include Operation.
- Интерпретация имени файла, полученного в результате макроподстановки директивы ‘#include’.
См. Computed Includes.
- Обработка директивы ‘#pragma’, которая после макроподстановки приводит к стандартной директиве.
Для любой строки директивы ‘#pragma’ не происходит макроподстановка, поэтому вопрос не возникает.
Обратите внимание, что GCC пока не реализует ни одну из стандартных директив.
Далее: Пределы реализации, Наверх: Детали реализации [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/cpp/Implementation-defined-behavior.html