В терминологии языков программирования C и C ++ единица трансляции (или, скорее, единица компиляции) является конечным входом для компилятора C или C ++, из которого создается объектный файл . [1] Единица трансляции примерно состоит из исходного файла после того, как он был обработан препроцессором C , что означает, что файлы заголовков, перечисленные в #include
директивах , буквально включаются , части кода внутри #ifndef
могут быть включены, а макросы были расширены.
Контекст
Программа АС состоит из блоков , называемых исходных файлов (или предварительной обработки файлов ), которые, в дополнение к исходному коду, включает в себя директивы для C препроцессором . Единица трансляции - это результат препроцессора C - исходный файл после предварительной обработки .
В частности, предварительная обработка состоит из расширения исходного файла для рекурсивной замены всех #include
директив буквальным файлом, объявленным в директиве (обычно файлы заголовков , но, возможно, и другие исходные файлы); Результатом этого шага является блок трансляции предварительной обработки . Дальнейшие этапы включают макрорасширения из #define
директив и условной компиляции из #ifdef
директив, среди прочих; это переводит блок трансляции предварительной обработки в единицу трансляции . Из единицы трансляции компилятор генерирует объектный файл , который может быть обработан и связан (возможно, с другими объектными файлами) для формирования исполняемой программы .
Обратите внимание, что препроцессор в принципе не зависит от языка и является лексическим препроцессором , работающим на уровне лексического анализа - он не выполняет синтаксический анализ и, следовательно, не может выполнять какую-либо обработку, специфичную для синтаксиса C. Входными данными для компилятора является единица трансляции, поэтому он не видит никаких директив препроцессора, которые были обработаны до начала компиляции. Хотя данная единица перевода в основном основана на файле, фактический исходный код, загружаемый в компилятор, может существенно отличаться от исходного файла, который просматривает программист, в частности, из-за рекурсивного включения заголовков.
Сфера
Единицы перевода определяют область действия , примерно область действия файла и функционируют аналогично области действия модуля ; в терминологии C это называется внутренней связью , которая является одной из двух форм связи в C. Имена (функции и переменные), объявленные вне функционального блока, могут быть видны либо только в пределах данной единицы перевода, и в этом случае они Говорят, что они имеют внутреннюю связь - они не видны компоновщику - или могут быть видны другим объектным файлам, и в этом случае говорят, что они имеют внешнюю связь и видны компоновщику.
C не имеет понятия о модулях. Однако отдельные объектные файлы (и, следовательно, единицы перевода, используемые для создания объектных файлов) функционируют аналогично отдельным модулям, и если исходный файл не включает другие исходные файлы, внутреннюю связь (область единицы перевода) можно рассматривать как «файл область, включая все файлы заголовков ".
Код организации
Основная часть кода проекта обычно хранится в файлах с .c
суффиксом (или .cpp
, .cxx
или .cc
для C ++ , который .cpp
используется наиболее традиционно). Файлы, предназначенные для включения, обычно имеют .h
суффикс ( .hpp
или .hh
также используются для C ++, но .h
наиболее распространены даже для C ++) и обычно не содержат определений функций или переменных, чтобы избежать конфликтов имен, когда заголовки включены в несколько исходных файлов, поскольку часто бывает. Заголовочные файлы могут быть и часто включаются в другие заголовочные файлы. Стандартной практикой для всех .c
файлов в проекте является включение хотя бы одного .h
файла.