Phases of translation
Исходный файл на языке C обрабатывается компилятором как если бы следующие этапы выполнялись именно в таком порядке. Фактическая реализация может комбинировать эти действия или обрабатывать их иначе, при условии сохранения того же поведения.
Содержание |
Фаза 1
- Исходный набор символов является многобайтовым набором символов, который включает базовый исходный набор символов как однобайтовое подмножество, состоящее из следующих 96 символов:
Фаза 2
#include <stdio.h> #define PUTS p\ u\ t\ s /* Line splicing is in phase 2 while macros * are tokenized in phase 3 and expanded in phase 4, * so the above is equivalent to #define PUTS puts */ int main(void) { /* Use line splicing to call puts */ PUT\ S\ ("Output ends here\\ 0Not printed" /* After line splicing, the remaining backslash * escapes the 0, ending the string early. */ ); }
Фаза 3
Если входные данные были разобраны на препроцессинговые токены до определенного символа, следующий препроцессинговый токен обычно принимается как самая длинная последовательность символов, которая может составлять препроцессинговый токен, даже если это приведет к последующему сбою анализа. Это обычно известно как maximal munch .
int foo = 1; // int bar = 0xE+foo; // ошибка: недопустимое число препроцессора 0xE+foo int bar = 0xE/*Комментарий раскрывается в пробел*/+foo; // OK: 0xE + foo int baz = 0xE + foo; // OK: 0xE + foo int pub = bar+++baz; // OK: bar++ + baz int ham = bar++-++baz; // OK: bar++ - ++baz // int qux = bar+++++baz; // ошибка: bar++ ++ +baz, а не bar++ + ++baz int qux = bar+++/*Разделяющий комментарий*/++baz; // OK: bar++ + ++baz
Единственное исключение из правила максимального захвата:
- Токены предварительной обработки имени заголовка формируются только внутри #include или #embed (начиная с C23) директивы, в __has_include и __has_embed выражениях (начиная с C23) и в определяемых реализацией местах внутри #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
Связывание происходит: единицы трансляции и компоненты библиотек, необходимые для удовлетворения внешних ссылок, собираются в программный образ, который содержит информацию, необходимую для выполнения в его среде выполнения (ОС).
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 5.1.1.2 Фазы трансляции (стр.: TBD)
-
- 5.2.1 Наборы символов (стр.: TBD)
-
- 6.4 Лексические элементы (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 5.1.1.2 Фазы трансляции (стр: 9-10)
-
- 5.2.1 Наборы символов (стр: 17)
-
- 6.4 Лексические элементы (стр: 41-54)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 5.1.1.2 Фазы трансляции (стр: 10-11)
-
- 5.2.1 Наборы символов (стр: 22-24)
-
- 6.4 Лексические элементы (стр: 57-75)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 5.1.1.2 Фазы трансляции (стр: 9-10)
-
- 5.2.1 Наборы символов (стр: 17-19)
-
- 6.4 Лексические элементы (стр: 49-66)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 2.1.1.2 Фазы трансляции
-
- 2.2.1 Наборы символов
-
- 3.1 Лексические элементы
Смотрите также
|
C++ documentation
для
Phases of translation
|