Фазы трансляции

Программы на языках C и C++ состоят из одного или нескольких исходных файлов, каждый из которых содержит часть текста программы. Исходный файл вместе с его файлами, файлами, включенными с помощью #include директивы препроцессора, но не включая разделы кода, удаленные директивами условной компиляции, такими как #if, называется единицей перевода.

Исходные файлы можно переводить в разное время. На самом деле, обычно переводятся только устаревшие файлы. Преобразованные записи преобразования можно обработать в отдельные файлы объектов или библиотеки объектного кода. Затем эти отдельные преобразованные записи преобразования объединяются для создания исполняемой программы или библиотеки динамической компоновки (DLL). Дополнительные сведения о файлах, которые можно использовать в качестве входных данных компоновщика, см. в разделе LINK input files.

Записи преобразования могут взаимодействовать следующим образом.

  • Вызовы функций с внешней компоновкой.

  • Вызовы функций-членов класса с внешней компоновкой.

  • Прямое изменение объектов с внешней компоновкой.

  • Прямое изменение файлов.

  • Межпроцессное взаимодействие (только для приложений на базе Microsoft Windows).

В следующем списке описываются этапы преобразования файлов компилятором.

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

Сложение строк
Все строки, заканчивающиеся обратной косой чертой (\) сразу после нового символа, присоединяются к следующей строке в исходном файле, формируя логические строки из физических строк. Если он не пуст, исходный файл должен заканчиваться новым символом, который не предшествует обратной косой черте.

Выделение лексем
Исходный файл разделен на токены предварительной обработки и символы пробела. Каждый комментарий в исходном файле заменяется одним пробелом. Символы новой строки сохраняются.

Предварительной обработки
Выполняются директивы предварительной обработки, и макросы разворачиваются в исходный файл. Оператор #include вызывает преобразование любого включенного текста, начинающееся с указанных выше трех шагов преобразования.

Сопоставление наборов символов
Все члены и escape-последовательности в исходной кодировке преобразуются в эквивалентные значения в кодировке выполнения. В Microsoft C и C++ исходная кодировка и кодировка выполнения являются кодировками ASCII.

Объединение строк
Все смежные строковые и расширенные строковые литералы объединяются. Например, "String " "concatenation" преобразуется в "String concatenation".

Перевод
Все токены анализируются синтаксически и семантически; эти токены преобразовываются в объектный код.

Компоновка
Все внешние ссылки можно использовать для создания исполняемой программы или библиотеки динамической компоновки.

Компилятор выдает предупреждающие сообщения или сообщения об ошибках во время преобразования, если обнаруживает синтаксические ошибки.

Компоновщик разрешает все внешние ссылки и создает исполняемую программу или DLL, объединяя одну или несколько отдельных обработанных записей преобразования со стандартными библиотеками.

См. также

Препроцессор