Ответ 1
Если вы используете объект, связанный с заголовком (например, некоторый тип) в файле, вы должны включить соответствующий заголовок для него. Не полагайтесь на заголовки, чтобы включать друг друга. Если вы используете его, включите его.
Стандартная библиотека С++ не включает включение <string>
в <vector>
и наоборот. Попытка использовать такую функциональность ограничивала бы код конкретной реализацией. В общем случае стандартные заголовки библиотек могут включать или не включать другие заголовки (или их собственные внутренние заголовки) в неуказанный порядок или способ. Одним из примечательных исключений является <initializer_list>
, который должен быть включен в несколько других стандартных заголовков. Изменения этого неуказанного порядка или способа также могут произойти, таким образом, нарушая ранее компиляцию кода с обновленным компилятором или обновленной реализацией стандартной библиотеки (это, как известно, произошло).
Также учтите, что если заголовочный файл является определением для класса, то он должен включать то, что требуется для определения этого класса. Связанный .cpp
должен включать связанный с ним .h
и остальные файлы, необходимые для реализации класса. Не нужно, не включайте его; не включайте больше, чем нужно (руководство по стилю llvm). Исключением является шаблоны (у которых нет связанного .cpp
); это исключение относится к другим реализациям только заголовка.
Отмечается, что сопровождение include, которое вы используете, может быть затруднено в долгосрочной перспективе; поэтому имеет смысл, что в начале цикла кодирования важно включить то, что требуется для интерфейса; а затем снова проверить включения с любыми разумными изменениями, внесенными в код.
Кажется, есть некоторый прогресс w.r.t. инструменты в этом отношении, такие как проект iwyu, который использует цепочку инструментов clang и, похоже, поддерживает msvc.
Один пример счетчика будет, если причиной заголовка будет включение других заголовков, а может быть, но даже тогда я буду очень осторожен - убедитесь, что он четко определен в том, что он включает. Примером этого может быть предварительно скомпилированный заголовок.