Как определяется модуль компиляции в 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 читаются (любезно предоставлено препроцессором).
Вот почему мы говорим о "единицах компиляции": что-то, что компилируется за один раз, результаты которого впоследствии могут быть связаны в исполняемые файлы.