Этапы трансляции
Исходный файл на языке C обрабатывается компилятором, как если бы выполнялись следующие этапы, именно в таком порядке. Реальная реализация может сочетать эти действия или производить их иначе, пока поведение остается тем же.
Этап 1
- Набор исходных символов - это многобайтовый набор символов, который включает в себя основной набор исходных символов как однобайтовое подмножество, состоящее из следующих 96 символов:
'0' до '9''a' до 'z' и от 'A' до 'Z'_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " 'Этап 2
Этап 3
<stdio.h> или "myfile.h"1..E+3.foo или 0JBK+, <<=, <% или ##.Если ввод был разобран на токены предобработки до заданного символа, то следующий токен предобработки обычно принимается за самую длинную последовательность символов, которую может составлять токен предобработки , даже если это приведет к сбою последующего анализа. Это обычно известно как максимальный выбор.
int foo = 1;
int bar = 0xE+foo; // ошибка: неверное предобрабатываемое число 0xE+foo
int baz = 0xE + foo; // OK
int pub = bar+++baz; // OK: bar++ + baz
int ham = bar++-++baz; // OK: bar++ - ++baz
int qux = bar+++++baz; // ошибка: bar++ ++ +baz, не bar++ + ++baz.
Единственным исключением из правила максимального выбора является:
- Препроцессорные токены предобработки имени заголовочного файла формируются только в директиве
#includeи в местах, определяемых реализацией, в директиве#pragma.
#define MACRO_1 1
#define MACRO_2 2
#define MACRO_3 3
#define MACRO_EXPR (MACRO_1 <MACRO_2> MACRO_3) // OK: <MACRO_2> не является именем заголовочного файла
Этап 4
Этап 5
Примечание: преобразование, выполняемое на данном этап, может управляться параметрами командной строки в некоторых реализациях: gcc и clang используют -finput-charset для указания кодировки набора исходных символов, -fexec-charset и -fwide-exec-charset для указания кодировки набора выполнимых символов в строковых литералах и символьных константах, которые не имеют кодирующий префикс (начиная с C11).
Этап 6
Соседние строковые литералы объединяются.
Этап 7
Происходит компиляция: токены анализируются синтаксически и семантически и транслируются как единицы трансляции.
Этап 8
Происходит компоновка: единицы трансляции и компоненты библиотек, необходимые для разрешения внешних ссылок, собираются в образ программы, который содержит информацию, необходимую для выполнения в её среде выполнения (ОС).
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
- 5.1.1.2 Translation phases (стр. 9-10)
- 5.2.1 Character sets (стр. 17)
- 6.4 Lexical elements (стр. 41-54)
- Стандарт C11 (ISO/IEC 9899:2011):
- 5.1.1.2 Translation phases (стр. 10-11)
- 5.2.1 Character sets (стр. 22-24)
- 6.4 Lexical elements (стр. 57-75)
- Стандарт C99 (ISO/IEC 9899:1999):
- 5.1.1.2 Translation phases (стр. 9-10)
- 5.2.1 Character sets (стр. 17-19)
- 6.4 Lexical elements (стр. 49-66)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 2.1.1.2 Translation phases
- 2.2.1 Character sets
- 3.1 Lexical elements
См. также
Документация C++ по Этапы трансляции
|