Моя философия заключается в том, что в хорошо написанном коде заголовочные файлы должны включать все остальные заголовочные файлы, от которых они зависят.Я считаю, что не должно быть возможности включить заголовочный файл и получить ошибку компилятора для этого.Следовательно, каждый заголовочный файл должен (после #ifdef
или #pragma once
включать защиту ) включать все остальные заголовки, от которых он зависит.
Для того, чтобы неофициально проверить, что вы запомниливключите правильные заголовки в ваши файлы заголовков, файлы * .cpp должны #include минимальный набор файлов заголовков, который должен работать.Поэтому, если существуют отдельные заголовочные файлы для A
, B
, C
и D
, а ваш файл cpp использует класс D
, то он должен включать только Dh .Ошибки компиляции не должны возникать, потому что Dh #include
s Ah и Ch , Ch включает Bh ,и Ah и Bh включают заголовок SFML (что бы это ни было). Ch и Dh могут включать заголовок SFML, если это кажется подходящим, но это не является действительно необходимым, если вы можете быть уверены, что зависимости ( Bh и Ах ) уже включил его.
Однако способ, которым Visual C ++ делает "предварительно скомпилированные заголовки", портит эту логику. требует , чтобы вы включили "StdAfx.h"
в качестве самого первого заголовочного файла, что заставляет многих разработчиков просто помещать все #include
s для всего проекта в StdAfx.h , а неиспользовать #include
в любом из других заголовочных файлов.Я не рекомендую это.Или они поместят все внешние зависимости в StdAfx.h (например, windows.h, boost заголовки) и #include локальные зависимости в другом месте, так что изменение одного заголовочного файла не обязательно приведет к перестройке всего проекта.
Как я пишу свой код, большинство моих файлов CPP включают StdAfx.h и соответствующий файл .H.Таким образом, A.cpp включает StdAfx.h и Ah, B.cpp включает StdAfx.h и Bh и так далее.Единственные другие #include
, помещенные в файл cpp, являются «внутренними» зависимостями, которые не отображаются в заголовочном файле.Например, если класс A
вызывает printf()
, то A.cpp (не Ah ) будет #include <stdio.h>
, поскольку Ah не зависит от stdio.h .
Если вы будете следовать этим правилам, то порядок, в котором вы #include
заголовки не имеет значения (если вы не используете предварительно скомпилированные заголовки: тогда предварительно скомпилированный заголовокидет первым в каждом файле cpp, но его не нужно включать в заголовочные файлы).