2012-04-09 4 views
2

Предположим, вы создаете класс с несколькими файлами .cpp (каждый из которых содержит реализацию функции-члена) и имеет объявление класса в файле .h. Кроме того, каждый файл .cpp включает файл .h через директиву include.Отдельная компиляция в C++

Мне сказали, что если вы измените реализацию любой из функций-членов (.cpp-файлов), вам придется перекомпилировать каждый .cpp-файл, чтобы запустить программу. То есть, если у меня было 5 функций-членов (каждый из них реализован в .cpp-файле), и я изменил реализацию 1 из .cpp-файлов, мне пришлось бы скомпилировать 1 .cpp-файл, который я изменил, и 4 других .cpp-файла I не изменилось, чтобы правильно запустить мою программу.

Мой вопрос, если предыдущее утверждение верно, почему утверждение верно? Любое понимание этой концепции было бы полезно.

+0

См. Этот [аналогичный вопрос] (http://stackoverflow.com/questions/9188101/recompile-after-base-class-change/9188135), относящийся к базовым классам. –

ответ

4

Это неверно. Если нет изменений в конкретном файле реализации, нет изменений в заголовочных файлах, которые он включает, а также никаких изменений в настройках среды или компилятора, нет необходимости перекомпилировать его. Все, что влияет на компиляцию этого файла, не изменилось.

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

+0

файлы заголовков также являются файлами C++ ... с использованием файла «реализация» или даже списка распространенных расширений ala .cc/.cpp, менее запутывают .... –

+1

@TonyDelroy Спасибо. Готово. –

3

Утверждение неверно. Фактически, вся причина make (и тому подобное) существует потому, что она ложна - они минимизируют время/усилия для восстановления приложения путем отслеживания изменений исходных файлов и повторного создания только объектных файлов, зависящих от источника файлы, которые были изменены. Обновляемые файлы объектов просто остаются в силе.

После того, как все объектные файлы обновлены, они связаны между собой для создания окончательного исполняемого файла (и, опять же, это обычно делается только в том случае, если хотя бы один объектный файл является более новым, чем текущий исполняемый файл).

Конечно, можно использовать make для заданий, не связанных с компиляцией и связыванием, но это почти наверняка используется, к которому они чаще всего относятся, и (по крайней мере, большинство) причин, по которым они были изобретены (единственное очевидное изменение заключается в том, что они первоначально использовались в основном для исходного кода C, а не для C++, но в этом отношении два почти неразличимы).

Единственное очевидное различие между ними заключается в том, что, когда вы используете шаблоны, вы обычно вставляете много кода в заголовки. В этом случае изменение заголовка заставляет повторно компилировать весь код, который включает этот заголовок, что часто бывает много. С C-кодом и/или не-шаблоном C++-кодом вы помещаете большую часть кода в исходный файл, поэтому вам нужно только перекомпилировать другие файлы, если вы измените интерфейс на код (который обычно меняет заголовок), но только этот файл необходимо перекомпилировать, если вы ограничите свои изменения в реализации без изменения интерфейса.

+0

+1 для хорошего ответа, хотя, конечно, частные и защищенные члены, встроенные функции и т. Д. - это другие примеры «реализации», которые часто встречаются в заголовках. В ответе pmcs перечислены некоторые ссылки о тех .... –

1

Как утверждают другие, утверждение неверно. Однако существуют интересные осложнения в отношении модифицированных исходных файлов, исходных зависимостей и перекомпиляции.Наиболее полезное обсуждение этого является, что неудивительно, учитывая в серии Guru должностей недели от Herb Sutter, в котором он обсуждает зависимость изоляции и идиомы Pimpl:

Compilation Firewalls

The Fast Pimpl Idiom

The Joy of Pimpls

Этот материал кажется эзотерическим почти каждому в первый раз, когда они видят его, но идиома Pimpl оказывается удивительно полезно на практике.

Смежные вопросы