2. Этап №1: препроцессор
∙ Язык препроцессора – это специальный язык
программирования, встроенный в C++.
∙ Препроцессор работает с кодом на C++ как с текстом.
∙ Команды языка препроцессора называют директивами, все
директивы начинаются со знака #.
∙ Директива #include позволяет подключать заголовочные
файлы к файлам кода.
1. #include <foo.h> — библиотечный заголовочный файл,
2. #include "bar.h" — локальный заголовочный файл.
∙ Препроцессор заменяет директиву #include "bar.h" на
содержимое файла bar.h.
2/7
3. Этап 2: компиляция
∙ На вход компилятору поступает код на C++ после
обработки препроцессором.
∙ Каждый файл с кодом компилируется отдельно и
независимо от других файлов с кодом.
∙ Компилируется только файлы с кодом (т.е. *.cpp).
∙ Заголовочные файлы сами по себе ни во что не
компилируются, только в составе файлов с кодом.
∙ На выходе компилятора из каждого файла с кодом
получается “объектный файл” — бинарный файл со
скомпилированным кодом (с расширением .o или .obj).
3/7
4. Этап 3: линковка (компоновка)
∙ На этом этапе все объектные файлы объединяются в один
исполняемый (или библиотечный) файл.
∙ При этом происходит подстановка адресов функций в
места их вызова.
void foo()
{
bar ();
}
void bar() { }
∙ По каждому объектному файлу строится таблица всех
функций, которые в нём определены.
4/7
5. Этап 3: линковка (компоновка)
∙ На этапе компоновки важно, что каждая функция имеет
уникальное имя.
∙ В C++ может быть две функции с одним именем, но
разными параметрами.
∙ Имена функций искажаются (mangle) таким образом, что
в их имени кодируются их параметры.
Например, компилятор GCC превратит имя функции foo
void foo(int , double) {}
в _Z3fooid.
∙ Аналогично функциям в линковке нуждаются глобальные
переменные.
5/7
6. Этап 3: линковка (компоновка)
∙ Точка входа — функция, вызываемая при запуске
программы. По умолчанию — это функция main:
int main ()
{
return 0;
}
или
int main(int argc , char ** argv)
{
return 0;
}
6/7