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