Мне всегда говорили, что я никогда не включаю файл *.cpp
.C++ Include Statement and Linking
Хорошая практика программирования только #include *.h
файлов не *.cpp
файлов?
Мне всегда говорили, что я никогда не включаю файл *.cpp
.C++ Include Statement and Linking
Хорошая практика программирования только #include *.h
файлов не *.cpp
файлов?
Да, вы могли бы подумать, что хорошая практика программирования!
Сказав это, в программировании нет догм. Я столкнулся с некоторыми случаями, когда было очень эффективно включить что-то еще, а затем файл .h.
Но только делайте это, если у вас есть достаточно опыта и очень хорошая причина для отклонения.
Что касается причины использования файлов заголовка:
С ++ является преемником C. Традиционно C и C++ не имеют механизма реального модуля, как, например, Модула или Ада. В принципе, несколько исходных файлов C++ скомпилированы независимо, только компоновщик видит их все после их компиляции. Положив, например, class в заголовке, заголовок становится своего рода интерфейсом модуля. Включив заголовок как в .cpp-файле модуля M, где определены члены класса, так и в других модулях, которые используют этот модуль M, создается связующий штырь. Таким образом, компилятор может проверить, соответствуют ли декларации в M в других модулях. Это позволяет проверять тип кросс-модуля.
Я также добавляю, что самый важный факт заключается в том, что в C++ мы должны различать определения и декларации. Если компилятор сопоставляет два одинаковых определения (определение функции или переменной), тогда выведите компиляцию с ошибкой и завершением. Если мы хотим использовать одну и ту же функцию во многих единицах перевода, которые скомпилированы независимо, вам необходимо объявить эту функцию. Таким образом, мы помещаем объявление в .hpp, и эти файлы могут быть #include другими файлами. В .cpp помещается определение (это означает, что компилятор присваивает память). Давайте рассмотрим глобальную или статическую переменную, которая не может быть помещена в файлы .hpp, потому что если компилятор столкнется с одним и тем же определением в том же пространстве имен, то прекратите компиляцию.
«Да», но это немного не подходит для ответа :) (Хотя были некоторые хаки для достижения цельной оптимизации программы до того, как она была обычно поддерживается) –
Поймите, что вы делаете, почему и как. Затем сделайте собственные выводы о том, какой лучший способ решить проблему. –