Отдельная компиляция на C++

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

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

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


person Pat Murray    schedule 09.04.2012    source источник
comment
См. этот похожий вопрос, связанный с базовыми классами.   -  person Jonathon Reinhart    schedule 26.09.2012


Ответы (3)


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

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

person David Schwartz    schedule 09.04.2012
comment
файлы заголовков также являются файлами C++... использование термина "файл реализации" или даже списка общих расширений аля .cc/.cpp менее запутанно.... - person Tony Delroy; 09.04.2012

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

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

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

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

person Jerry Coffin    schedule 09.04.2012
comment
+1 за хороший ответ, хотя, конечно, частные и защищенные члены, встроенные функции и т. д. - другие примеры реализации, часто встречающиеся в заголовках. В ответе pmcs перечислены некоторые ссылки на эти... - person Tony Delroy; 09.04.2012

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

брандмауэры компиляции

Идиома Fast Pimpl

Радость прыщей

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

person pmcs    schedule 09.04.2012