C++/Единица трансляции

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

Единица трансляции (translation unit) в языках программирования C и C++ — подаваемый на вход компилятора исходный текст (файл с расширением .c или .cpp) со всеми включёнными в него файлами. Важная концепция этих языков.

В отличие от многих других языков программирования (Pascal, Java, C#), в Си единицы трансляции компилируются по отдельности, никак не пересекаясь. За «стыковкой» единиц в программу следит исключительно компоновщик. Есть две технологии написания программ на Си: «множество единиц трансляции» и «одна единица трансляции».

Множество единиц трансляции

Традиционная техника, при которой каждый cpp файл компилируется по отдельности, после чего объектные файлы собираются в исполняемый файл компоновщиком.

Одна единица трансляции

Техника, при которой несколько cpp файлов объединяются не компоновщиком, а с помощью директив препроцессора (#include). Например:

// compile_me.cpp
#include "foo.cpp"
#include "bar.cpp"
// foo.cpp
#include <iostream> // Крупный стандартный заголовок
#include "bar.hpp" // Заголовок функции 'bar'

int main() {
  bar();
}
// bar.cpp
#include <iostream> // Всё тот же крупный заголовок (второй раз подключен не будет!)

void bar() {
  ...
}

Плюсы такой структуры: ускоряется полная сборка, расширяется диапазон возможных оптимизаций. Упрощается адаптация чужих библиотек под экзотические компиляторы (например, Embarcadero C++ Builder в режиме __fastcall). (Для версии XE2 приходится отключать предупреждения, а #include стандартной библиотеки оборачивать в соглашение о вызове __cdecl.) Минус — при небольших изменениях в коде перекомпилируется вся программа.

В виде одной единицы трансляции часто выпускают крупные открытые библиотеки (например, SQLite). При этом программируют их «по старинке», огромным количеством единиц, а из одного вида в другой переводят несложным препроцессором.