Spec-Zone.ru › GCC 12 CPP

11.1 Определяемое реализацией поведение

Вот как CPP ведет себя во всех случаях, которые стандарт C описывает как определяемое реализацией. Этот термин означает, что реализация свободна делать, что хочет, но должна задокументировать свой выбор и придерживаться его.

  • Сопоставление физических многобайтовых символов исходного файла с символом исполнения.

    Набор входных символов можно указать с помощью опции -finput-charset, а набор символов выполнения можно контролировать с помощью опций -fexec-charset и -fwide-exec-charset.

  • Символы идентификаторов.

    Стандарты C и C++ позволяют использовать идентификаторы, составленные из ‘_’ и буквенно-цифровых символов. C++ также допускает универсальные имена символов. Стандарты C99 и более поздние стандарты C допускают как универсальные имена символов, так и определяемые реализацией символы. В обоих режимах C и C++, GCC принимает в идентификаторах ровно те расширенные символы, которые соответствуют универсальным именам символов, разрешенным выбранным стандартом.

    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-12.1.0/cpp/Implementation-defined-behavior.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API