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’, которая после макро-расширения приводит к стандартному пragma.
Никакого макро-расширения не происходит в строке любой директивы ‘#pragma’, поэтому вопрос не возникает.
Обратите внимание, что GCC пока не реализует ни одного из стандартных pragmas.
Далее: Ограничения реализации, Вернуться к: Детали реализации [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-7.5.0/cpp/Implementation-defined-behavior.html