Зачем использовать файлы .cpp, если я могу хранить весь свой код C ++ в файле .h? - PullRequest
6 голосов
/ 25 декабря 2010

Зачем использовать файлы .cpp, если у меня есть весь код C ++ в файле .h?Я имею в виду, что файлы .cpp довольно странно использовать, если весь код можно записать в файл .h?Может ли кто-нибудь из них прояснить?

Ответы [ 3 ]

8 голосов
/ 25 декабря 2010

Несколько причин:

(1) Время инкрементной сборки

Когда проекты становятся больше, управление временем сборки проблематично, особенно для проектов C ++. Строительство 1 или 5 минут после незначительного изменения имеет большое значение. Это подчеркивается большинством изменений в крупных проектах, поскольку и требуют большого тестирования. Добавьте к этому любые попытки TDD и рефакторинга, и вы - мертвый слизень с сицилийской обувью.

Разделение на заголовок и тело и перемещение его в библиотеки значительно увеличивает время инкрементной сборки.

(2) Статика
Для многих вещей вам нужен один экземпляр типа, т.е.

// .cpp
static Foo foo;

Нет способа (который я знаю) разрешить это в проекте только для заголовков. Решения для конкретных компиляторов ограничены, например, __declspec(selectany) в MSVC ограничен типами POD.

[edit] C ++ 17 теперь позволяет использовать inline также для инициализации переменных, так что это больше не проблема блокировки.

(3) Сокрытие реализации
Разделение .cpp / .h - единственный способ четко отделить открытый интерфейс от деталей реализации. Вы можете бросить учеников в секцию private, но это не работает для других сущностей. (Даже разделение заголовка и тела является утечкой, если вы не добавите дополнительные методы, такие как PIMPL, так что этот аргумент немного слаб IMO, но, опять же, в большом проекте я бы очень упустил этот эффективный, если несовершенный метод).


В любом случае, отличный вопрос - вы поняли, что есть что-то не так с моделью сборки C / C ++, которую я считаю древним пережитком ужасных последствий.

Вы должны попробовать, насколько далеко вы можете протолкнуть модель «только заголовки» (или, по крайней мере, «почти только заголовки», чтобы учесть статику). Вы можете получить довольно далеко - также было бы интересно услышать от людей, которые пытались.

Возможно, стоит попробовать использовать статические библиотеки для разделения и инкапсуляции реализаций, а в остальном держать весь код в заголовках. Я вижу некоторые проблемы с этим, но это значит, что наш текущий способ работы без проблем.

3 голосов
/ 25 декабря 2010

Вы можете поместить весь свой код в файлы .h.Вопреки распространенному мнению, это не будет дублировать код в ваших файлах .obj.Современные компиляторы намного умнее этого.

Хотя компиляция является проблемой.Если у вас есть 20 .h файлов, включенных в main.cpp, компиляция main.cpp займет некоторое время.И он будет перекомпилироваться, включая все 20 ваших файлов реализации .h, каждый раз, когда изменяется один из ваших включаемых файлов.Это выглядит неправильно для меня.Но это вопрос предпочтения.

Тогда есть ссылки.Если ClassA использует ClassB, а ClassB использует ClassA, какой из них вы сначала включите?

2 голосов
/ 25 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...