Spec-Zone.ru › GCC 6 CPP

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.

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

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

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

    Препроцессор и компилятор интерпретируют символьные константы одинаково; т. е. последовательности escape, такие как ‘\a’, получают значения, которые они имели бы на целевой машине.

    Компилятор оценивает многосимвольную символьную константу символ за символом, сдвигая предыдущее значение влево на количество битов на символ целевой системы, а затем объединяя в него битовую структуру нового символа, усеченную до ширины символа целевой системы. Конечная битовая структура получает тип int, и поэтому является знаковым, независимо от того, являются ли отдельные символы знаковыми или нет (небольшое изменение по сравнению с версиями 3.1 и более ранними GCC). Если в константе содержится больше символов, чем помещается в целевой 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-6.5.0/cpp/Implementation-defined-behavior.html

Spec-Zone.ru

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