Зачем использовать .cpp-файлы, если у меня есть весь код C++ в файле .h? Я имею в виду .cpp-файлы довольно странно использовать, если весь код можно написать в .h-файле? Может ли кто-нибудь сделать это?Зачем использовать .cpp-файлы, если у меня есть весь код C++ в файле .h?
ответ
Несколько причин:
(1) Инкрементальное время сборки
Когда проекты растут больше, управляя время сборки проблематично, особенно для проектов C++. Строительство 1 или 5 минут после незначительных изменений имеет большое значение. Это подчеркивается большинством изменений в крупных проектах, которые являются небольшими и требуют много испытаний. Добавьте к этому любую попытку TDD и рефакторинг, и вы мертвый слизник с сицилийскими ботинками.
Разделение на заголовок и тело и перемещение его в библиотеки улучшает инкрементное время сборки.
(2) статика
Для многих вещей, которые нужно один экземпляр типа, т.е.
// .cpp
static Foo foo;
Там нет никакого способа (что я знаю), что позволяет это в header- только проект. Конкретные решения для компилятора ограничены, например. __declspec(selectany)
в MSVC ограничивается типами POD.
(3) Реализация скрывается
.cpp/.h разделение является единственным способом, чтобы четко отделить публичный интерфейс от деталей реализации. Вы можете бросить членов класса в раздел private
, но это не работает для других объектов. (Даже разделение заголовка/тела негерметично, если вы не добавляете дополнительные методы, такие как PIMPL, поэтому этот аргумент немного слаб ИМО, но опять же, в большом проекте, я бы очень пропустил этот эффективный, если несовершенный метод).
Большой вопрос, так или иначе - вы признали, что есть что-то прервала с C/C++ построить модель, которую я считаю древнюю реликвию ужасных последствий.
Вы должны попробовать, как далеко вы можете нажать модель «только заголовок» (или, по крайней мере, «почти только заголовки», чтобы можно было использовать статику). Вы могли бы получить довольно далеко - также было бы интересно услышать от людей, которые пробовали.
Возможно, стоит попробовать использовать статические библиотеки для разделения и инкапсуляции реализаций и, в противном случае, сохранить весь свой код в заголовках. Я вижу некоторые проблемы с этим, но это не так, что наш текущий modus operandi невозможен.
Файлы заголовка (.h) предназначены для определения интерфейса, чтобы ваши классы и код могли использоваться в других единицах перевода. Если вы поместите реализацию в файл .h, то вы получите несколько копий одного и того же кода, скомпилированных в каждую единицы перевода, которая включает этот файл .h. Это поражает точку разделения вашего кода на мелкие кусочки, которые можно изучать и разрабатывать изолированно.
Я думаю, что это все равно можно сделать, вы можете включить публичный интерфейс в заголовки, которые включают «заголовки реализации», так же, как увеличение происходит с подпапками 'details \ '. Без интенсивного использования интерфейсов разделение .h/.cpp не очень хорошо сочетается с разделом интерфейса/реализации. – peterchen
Вы можете положить весь ваш код в .h файлы. Вопреки распространенному мнению, это не будет дублировать код через ваши .obj-файлы. Современные компиляторы гораздо умнее, чем это.
Компиляция - это несколько проблема. Если у вас есть 20 файлов .h, которые включены в main.cpp, компиляция main.cpp займет некоторое время. И он будет перекомпилирован, включая все 20 ваших файлов .h файлов. Каждый раз, когда изменяется один из ваших включенных файлов.
Тогда есть стиль. Это просто выглядит неправильно. Но это вопрос предпочтения.
Тогда есть ссылки. Если ClassA использует ClassB, а ClassB использует ClassA, какой из них вы включите первым?
Я не вижу, где в него входят современные компиляторы. Когда у вас есть несколько единиц перевода, которые включают файлы заголовков с реализацией, вы будете дублировать код в объектных файлах. Да, теоретически это дублирование можно было бы удалить, но это должно было бы быть сделано компоновщиком, а не компилятором. –
Ваше предположение о роли компоновщика и компилятора довольно устарело. Генерация кода с временным кодом широко используется уже десять лет. Небрежный способ его установки заключается в том, что с помощью LTCG компилятор является просто фантастическим препроцессором: файлы .obj на самом деле не содержат машинный код. И удаление дубликата (и ненужного, и т. Д.) Кода является данным. – martona
все звуки очень умны - просто стыдно, что нужно справиться с устаревшей моделью сборки C/C++! –
- 1. (C++) Весь класс в файле .h?
- 2. Зачем мне ifelse, если у меня уже есть фильтр намерений в файле манифеста?
- 3. Почему у меня есть код javascript в файле .aspx и C# в .cs-файле?
- 4. У меня есть программа C#
- 5. Есть ли у меня код связанного списка?
- 6. «Мышление в Scala», если у меня есть фон Java/C++?
- 7. Зачем использовать форвардное объявление, а не #import в .h файле?
- 8. Зачем использовать condition_variable, если у нас уже есть уведомляющая переменная?
- 9. Как создать образ Mat в OpenCV, если у меня есть значения h, s и v?
- 10. JAVA: тест, если число простое (У меня есть код)
- 11. Зачем использовать SIMD, если у нас есть GPGPU?
- 12. ASP.NET MVC, если у меня есть изменения
- 13. Зачем нужно использовать JsonRequestBehavior, если у нас уже есть [HttpPost]?
- 14. несовместимо # если/# endif пара в * .h файле
- 15. У меня есть этот код .... Этический взлом
- 16. Зачем нужен файл .hpp в файле .h?
- 17. У меня есть следующая строка в текстовом файле:
- 18. Если у меня есть более 1 пакета
- 19. У меня есть ноль, если нет Продажи
- 20. У меня есть только файл dll без файлов .h и .lib. Как его использовать в vC++?
- 21. C++ когда включать cpp, даже если у нас есть .h файл
- 22. android.osnetworkonmainthreadexception даже если у меня есть AsyncTask
- 23. Если у меня есть и Visual Studio 2008 и 2010, у меня есть, чтобы сохранить и
- 24. У меня есть java.lang.ArrayIndexOutOfBoundsException
- 25. Как проверить, если у меня есть текст в моем входе
- 26. Какие знания C# у меня есть?
- 27. Как загрузить файлы в коробку? У меня есть код поворота
- 28. У меня есть недопустимые аргументы
- 29. У меня есть сообщение об ошибке в файле manifest.json
- 30. У меня есть два вопроса относительно C#
+1 для вызова модели сборки/ссылки C/C++, которая действительно довольно тяжелая –