Как вы организуете заголовки STL?
Я работаю над большим проектом, который использует STL и имеет вопрос о вашем предпочтительном способе организации вашего STL #includes
.
- вы предпочитаете #включать каждый заголовок в исходный файл, который он используется. Например, если оба
foo.cpp
иbar.cpp
требуютсяstd::string
, как#include <string>
. - вы предпочитаете иметь один файл заголовка, который включает все заголовки STL, используемые вашим проектом (т. е. добавить их в MS 'stdafx.предварительно скомпилированные ч' заголовок.)
преимущество первого метода заключается в том, что.cpp-файл является независимой единицей и может использоваться в другом проекте, не беспокоясь о том, что вам не хватает #include
. Преимущества второго метода в том, что вы можете использовать поддержку предварительно скомпилированного заголовка компиляторов плюс вы можете обернуть STL #includes
на pragmas
которые отключают некоторые предупреждения (например, некоторые заголовки Boost вызывают предупреждения при компиляции на уровне 4).
что вы предпочитаете использовать?
4 ответов
Я включаю только заголовочные файлы, которые действительно нужны в каждом источнике, а не "ловить все" заголовки, чтобы сохранить зависимости (и, следовательно, время компиляции) как можно ниже.
предварительно скомпилированные заголовки могут работать независимо от этого (т. е. я полагаюсь на предварительно скомпилированные заголовки для ускорения процесса компиляции, а не для получения объявлений). Поэтому, даже если что-то объявляется через включенные предварительно скомпилированные заголовки, я все равно включаю "обычный" заголовок, который будет пропущен включенным охранником механизм и не добавит ничего существенного во время компиляции.
Как предкомпилированных заголовков конкретного компилятора вещь. Оптимизация / изменение предварительно скомпилированных заголовков не должно влиять на правильное функционирование кода, на мой взгляд.
основным преимуществом наличия зависимостей как можно ниже является то, что рефакторинг становится проще (или, скорее: выполнимо)
отличная книга обо всем этом крупномасштабный дизайн C++ от Lakos
Что я делаю, это включить все заголовки STL, которые мне понадобятся во всем проекте в моем сингле предкомпилированного заголовка, обычно StdAfx по умолчанию.h. Предварительно скомпилированный заголовок-это де-факто первое, что нужно настроить в проекте, включая все заголовки STL-/boost - / platform и сторонние библиотеки.
STL & boost аккуратно расположены в пространствах имен, поэтому они никогда не вызывают никаких ошибок или перекрытий.
в заголовках я обычно использую полные имена, но в исходные файлы использование пространства имен x при необходимости.
вы можете объединить эти два метода:
У обоих .cpp-файлы включают, а также добавляют его в stdafx.h. Это все равно даст вам оптимизацию PCH.
The .cpp-файл по-прежнему должен #включать "stdafx.h", поэтому его независимость спорна. Однако зависимость является состоянием явно и удаляет stdafx.h включить проще, чем найти все отсутствующие включает. Кроме того, стандартные заголовки-как и все заголовки-убедитесь, что они не включены дважды.
В общем, я согласен с вашим подходом, чтобы сделать каждый файл "независимым", то есть когда .cpp добавляется в другой проект или a .h включен, он заботится о своих зависимостях.
помните, что PCH-это компромисс, они могут стать огромными. Наличие в основном неиспользуемого кода в PCH может фактически замедлить ваши сборки. Быстрые диски очень помогают, хотя :)
также имейте в виду, что включение предварительно скомпилированных заголовков в MSVC по крайней мере в некоторых версии фактически изменяют обработку: объявления перед #включают " stdafx.h " игнорируются, поэтому это должно быть ваше первое заявление без комментариев. Ужасная ловушка.
полностью согласен с предложением для книги Джона Лакоса крупномасштабного дизайна C++.
объявить все заголовки, необходимые для файл, будь .h или .ЦПП в самом файле. Не полагайтесь на побочные эффекты файлов, включенных в другие заголовочные файлы.
наличие большого списка заголовочных файлов Все включает в себя увеличивает зависимости излишне и делает дизайн очень хрупким.
о, еще одна вещь никогда не использует объявления в заголовочном файле. Только всегда используйте их внутри ваши файлы реализации .cpp-файлы.
HTH.
спасибо,
Роб