2015-07-11 2 views
-4

Мне всегда говорили, что я никогда не включаю файл *.cpp.C++ Include Statement and Linking

Хорошая практика программирования только #include *.h файлов не *.cpp файлов?

+0

«Да», но это немного не подходит для ответа :) (Хотя были некоторые хаки для достижения цельной оптимизации программы до того, как она была обычно поддерживается) –

+0

Поймите, что вы делаете, почему и как. Затем сделайте собственные выводы о том, какой лучший способ решить проблему. –

ответ

2

Да, вы могли бы подумать, что хорошая практика программирования!

Сказав это, в программировании нет догм. Я столкнулся с некоторыми случаями, когда было очень эффективно включить что-то еще, а затем файл .h.

Но только делайте это, если у вас есть достаточно опыта и очень хорошая причина для отклонения.

Что касается причины использования файлов заголовка:

С ++ является преемником C. Традиционно C и C++ не имеют механизма реального модуля, как, например, Модула или Ада. В принципе, несколько исходных файлов C++ скомпилированы независимо, только компоновщик видит их все после их компиляции. Положив, например, class в заголовке, заголовок становится своего рода интерфейсом модуля. Включив заголовок как в .cpp-файле модуля M, где определены члены класса, так и в других модулях, которые используют этот модуль M, создается связующий штырь. Таким образом, компилятор может проверить, соответствуют ли декларации в M в других модулях. Это позволяет проверять тип кросс-модуля.

0

Я также добавляю, что самый важный факт заключается в том, что в C++ мы должны различать определения и декларации. Если компилятор сопоставляет два одинаковых определения (определение функции или переменной), тогда выведите компиляцию с ошибкой и завершением. Если мы хотим использовать одну и ту же функцию во многих единицах перевода, которые скомпилированы независимо, вам необходимо объявить эту функцию. Таким образом, мы помещаем объявление в .hpp, и эти файлы могут быть #include другими файлами. В .cpp помещается определение (это означает, что компилятор присваивает память). Давайте рассмотрим глобальную или статическую переменную, которая не может быть помещена в файлы .hpp, потому что если компилятор столкнется с одним и тем же определением в том же пространстве имен, то прекратите компиляцию.