Spec-Zone.ru › GCC 4 CPP

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

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

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

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

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

    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’, которая после макро-расширения приводит к стандартному пragma.

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

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

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

Spec-Zone.ru

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