Имеет ли значение, поместил ли я директиву #include в мой файл cpp или во включенный заголовочный файл? - PullRequest
3 голосов
/ 08 февраля 2011

Моя программа на С ++ использует отдельный заголовочный файл (назовем его myHeader.h) и поэтому включает его (#include "myHeader.h").В моей программе мне нужно использовать другой заголовочный файл (назовем его another.h).Имеет ли значение, помещаю ли я директиву #include "another.h" в файл cpp или в myHeader.h?

Ответы [ 6 ]

14 голосов
/ 08 февраля 2011

Если он не используется в файле .h, разницы в успешности / сбое компиляции не будет.

Тем не менее, рекомендуется включать заголовочные файлы, которые вам нужны только в реализации, в файлы .cpp по следующим причинам:

  • по причинам инкапсуляции - никто не должен знать, что вы включаете исключительно для реализации.
  • Включение файла A.h в заголовочный файл B.h также сделает любой файл, который включает B.h, включает A.h. Это может вызвать серьезные проблемы с зависимостью между внешне несвязанными файлами.
  • по вышеуказанной причине он также может существенно увеличить время сборки (каждый включаемый файл копируется в ваш модуль компиляции).
7 голосов
/ 08 февраля 2011

Если вам нужно включить заголовок только в ваш файл cpp, то вы должны включить его в свой файл cpp.

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

5 голосов
/ 08 февраля 2011

Ответ на ваш вопрос - «Нет».Однако вам следует избегать ненужных операторов include в ваших .h файлах, поскольку это приведет к увеличению времени сборки.Это также лучше по причинам инкапсуляции.

1 голос
/ 08 февраля 2011

Если все ваши охранники включены и т. Д., То нет.

Лучше подумать о том, как пользователь будет использовать код, и постараться избежать их неожиданностей.

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

НО вы также должны убедиться, что у вас есть все расширенные объявления вразместить так, чтобы порядок включений в файле cpp не имел значения.

0 голосов
/ 08 февраля 2011

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

Это также увеличивает физическую зависимость источника - Разработка программного обеспечения C ++ Джона Лакоса * решает эту проблему и заслуживает прочтения по структурированию программ на c ++.Он был опубликован в 1996 году, поэтому он не основан на текущей практике, но совет по структуре стоит знать.

0 голосов
/ 08 февраля 2011

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

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