Spec-Zone.ru › GCC 8 CPP

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.

  • Непустые последовательности символов пробелов.

    В текстовом выводе каждая последовательность пробелов сводится к одному пробелу. По эстетическим соображениям, первому токену на каждой строке без директив вывода предшествуют достаточное количество пробелов, чтобы он отображался в той же колонке, что и в исходном файле.

  • Числовое значение символьных констант в выражениях препроцессора.

    Препроцессор и компилятор интерпретируют символьные константы одинаково; т. е. управляющие последовательности, такие как ‘\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 пока не реализует ни одного из стандартных pragma.

Далее: Пределы реализации, Вверх: Детали реализации [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/cpp/Implementation-defined-behavior.html

Spec-Zone.ru

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