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