11.1 Определяемое реализацией поведение
Вот как CPP ведет себя во всех случаях, которые стандарт C описывает как определяемое реализацией. Это означает, что реализация свободна делать что ей угодно, но должна задокументировать свой выбор и придерживаться его.
- Сопоставление многобайтовых символов физического исходного файла с набором символов выполнения.
Набор символов ввода можно указать с помощью опции -finput-charset, а набор символов выполнения можно контролировать с помощью опций -fexec-charset и -fwide-exec-charset.
- Символы идентификаторов.
Стандарты C и C++ разрешают использовать для идентификаторов символы «_» и алфавитно-цифровые символы. C++ и C99 также допускают универсальные имена символов, а C99 дополнительно разрешает определяемые реализацией символы.
GCC разрешает использовать символ «$» в идентификаторах как расширение для большинства целевых платформ. Это верно независимо от переключателя std=, так как это расширение не может вступать в конфликт с программами, соответствующими стандартам. Однако при предварительной обработке ассемблера символы доллара по умолчанию не являются символами идентификаторов.
В настоящее время целевые платформы, которые по умолчанию не допускают символ «$», это AVR, IP2K, MMIX, MIPS Irix 3, ARM aout и целевые платформы PowerPC для операционной системы AIX.
Вы можете переопределить значение по умолчанию с помощью -fdollars-in-identifiers или fno-dollars-in-identifiers. См. fdollars-in-identifiers.
- Непустые последовательности пробельных символов.
В текстовом выводе каждая последовательность пробельных символов сводится к одному пробелу. По эстетическим соображениям, первый токен на каждой строке без директив в выводе предваряется достаточным количеством пробелов, чтобы он отображался в той же колонке, что и в исходном файле.
- Числовое значение символьных констант в выражениях препроцессора.
Препроцессор и компилятор интерпретируют символьные константы одинаково; т. е. последовательности экранирования, такие как ‘\a’, получают значения, которые они имели бы на целевой машине.
Компилятор оценивает многосимвольную символьную константу по одному символу за раз, сдвигая предыдущее значение влево на количество бит на символ целевой системы, а затем объединяя битовую структуру нового символа, усеченного до ширины символа целевой системы. Результирующая битовая структура получает тип
int, и поэтому является знаковым, независимо от того, являются ли отдельные символы знаковыми или нет (небольшая модификация по сравнению с версиями GCC 3.1 и более ранними). Если в константе больше символов, чем может уместиться в целевом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.
Для любой строки директивы ‘#pragma’ макроподстановка не выполняется, поэтому вопрос не возникает.
Обратите внимание, что GCC пока не реализует ни одну из стандартных директив pragma.
Далее: Пределы реализации, Назад: Подробности реализации [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/cpp/Implementation-defined-behavior.html