Spec-Zone.ru › GCC 13 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’.

    См. Вычисленные включения.

  • Обработка директивы ‘#pragma’, которая после макро-расширения превращается в стандартную директиву pragma.

    Никакого макро-расширения не происходит в строке с директивой ‘#pragma’, поэтому вопрос не возникает.

    Обратите внимание, что GCC пока не реализует ни одну из стандартных директив pragma.

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

Spec-Zone.ru

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