Как определяется модуль компиляции в C++?

Возможный дубликат:
Что такое "единица перевода" в C++

Часто говорят, что объявленные в C/C++ статические переменные не видны в единицах компиляции? Значит ли это, что каждый файл.c или.cpp является отдельным модулем компиляции? Как насчет файла, h и статических переменных, объявленных в файле.h? Считается ли файл.h отдельным модулем компиляции?

3 ответа

Решение

Заголовочные файлы не имеют отдельной жизни, только их содержимое #included в.c или.cpp файлы. Но с тех пор #include обрабатывается препроцессором, компилятор не знает о различных заголовочных файлах; он только видит результирующий листинг кода в качестве ввода. Это то, что называется модулем компиляции: исходный файл со всеми его #include директивы заменены содержимым соответствующих заголовочных файлов.

Компиляция C и C++ (обычно) делится на три независимых этапа:

  • Предварительная обработка с использованием макросов и расширений #include.
  • Компиляция, преобразование исходного кода в двоичный код и создание объектных файлов intermediante.
  • Связывание, объединение объектных файлов в одном файле ELF или EXE.

Везде, где есть #include или макрос, препроцессор расширяет это выражение фактическим значением. В случае #include вся эта строка заменяется содержимым файла.h.

Фактический компилятор (обычно) не знает ни о каком заголовочном файле, он видит модуль компиляции как большой файл.c или.cpp.

"Обычно" возникает из-за того, что некоторые компиляторы оптимизируют включение заголовков, сохраняя предварительно скомпилированный заголовок в некотором виде кеша, но эффект тот же.

Компилятор обрабатывает только исходные файлы, обычно с расширением.c или.cpp. Компилятору на самом деле нет дела до включаемых файлов: поскольку компилятор обычно реализуется, каждый файл.c/.cpp обрабатывается заново, независимо от того, какие файлы.h читаются (любезно предоставлено препроцессором).

Вот почему мы говорим о "единицах компиляции": что-то, что компилируется за один раз, результаты которого впоследствии могут быть связаны в исполняемые файлы.

Другие вопросы по тегам