Препроцессор Си, встречая следующие директивы:
#include "..." или
#include <...> полностью копирует содержимое указанного файла в файл, в котором указана эта директива, в месте вызова директивы. Эти файлы обычно содержат определение интерфейса для различных функций библиотек и типов данных, которые должны быть подключены перед их использованием; таким образом, директива #include обычно указывается в начале (заголовке) файла. По этой причине подключаемые файлы и называются заголовочными. Некоторые содержат примеры из стандартной библиотеки Си (<math.h> и <stdio.h>), обеспечивая математические функции и функции ввода-вывода соответственно.
При использовании препроцессора одновременно с упрощением использования кода его использование несколько замедляет написание кода из-за недостаточной эффективности и требует дополнительного использования условной компиляции для предотвращения множественных включений указанного заголовочного файла.
Начиная с 1970-х среди программистов все большее распространение и известность получают альтернативные способы переиспользования подключения файлов, применяемых в большинстве языков программирования: Java и Common Lisp используют пакеты, Паскаль использует юниты (единицы), Modula, OCaml, Haskell и Python используют модули, а D, разработанный как замена языков Си и C++, использует импорт.