Правила ввода функций в заголовочных файлах
в последнее время я начал ставить больше и больше функций в заголовочные файлы, в основном для удобства. Но я боюсь, что я могу переусердствовать, мои заголовки полны includes, и я не уверен, что это хорошая идея.
каковы ваши правила для переноса функций из заголовочных файлов?
Если вам интересно, я говорю о разработке приложений, а не библиотек.
Edit:
Я думаю, это полезно, если я изложите плюсы / минусы встроенных (естественно) функций заголовка по сравнению с функциями реализации с моей точки зрения:
Pro inline:
- более чистый/сжатый.
- нет необходимости в дублировании подписи.
- нет необходимости изменять любой Makefile для связи с новыми файлами.
- мгновенная возможность ввести параметры шаблона.
Contra inline:
- увеличенное время компиляции (мне все равно это много)
- многие включают в заголовки (не должно быть такой большой проблемой, если они используют охранников)
согласно этому, кажется хорошей идеей поместить почти каждую функцию в заголовки, и я считаю, что это довольно близко к тому, что делают STL и Boost (хотя это библиотеки, в отличие от моего кода).
7 ответов
одно из моих самых нерушимых правил: в файлах заголовков разрешены только встроенные тела функций. Все остальное требует проблем с несколькими определениями на этапе связи.
заголовки следует оставлять преимущественно для объявлений, а не для определений. У меня есть исключения из этого правила (будучи гибким типом), но ни один из них не включает в себя не встроенные тела функций.
мое эмпирическое правило: "не в заголовке, если вам не нужно."А что касается удобства, считаете ли вы увеличение времени компиляции удобным?
есть несколько очевидных технических аспектов - шаблоны и встроенные функции должны быть в заголовках - заголовки, включенные из нескольких единиц перевода, должны быть осторожны с правилом одного определения - более прямолинейно, вы хотели бы чертовски хорошую причину даже рассмотреть возможность размещения реализации функции вне строки в заголовке, и я не могу вспомнить ни одного раза, когда я даже был соблазнен.
Итак, вопрос сводится к:
inline в заголовке против out-of-line внутри файл реализации?
факторы:
- вы говорите, что разрабатываете код уровня приложения, а не библиотеки, поэтому вам (в настоящее время) не нужно беспокоиться о том, что другие команды зависят от вашего кода, а также минимизировать их потребность в перекомпиляции (по сравнению с просто relink), сохраняя реализацию вне линии
- но если вы пишете хороший код, который имеет потенциал, чтобы стать полезным для других команд, то вы могли бы найти себя желая бы реализация частного
- inline против out-of-line обычно представляет собой накладные расходы порядка величины для тривиальных функций получения/набора данных... если у вас есть функции, которые вызываются повторно из критического кода производительности, то у вас есть причина предпочесть inlining
- реализация в заголовке (особенно если она смешивается с объявлениями) часто может запутать API, но иногда на самом деле делает код более самодокументирование
- локализация и удаленная избыточность (объединения объявлений/ определений) определенно устраняет потенциал для опечаток / ошибок и часто может повысить производительность
итог: если вы обнаруживаете, что делаете это все больше и больше, то это, очевидно, работает на вас, и нет никаких особых причин думать, что вы собираетесь обжечься. Следите за потенциальными проблемами, но не перепроектируйте чертовски из вещей, основанных на некоторых гипотетическая и маловероятная материализация беспокойства.
хороший стандарт кодирования подскажет вам реализовать методы и функции в исходном файле (cpp).
Если вы предпочитаете, вы можете реализовать шаблоны и встроенные функции в заголовке.
Так как это было помечено как C++
, Почему бы вам не разделить их на логические class
es?
обычно у меня есть один class
объявление в заголовочном файле и его определение в соответствующем исходном файле.
во-первых, функция шаблона должна быть помещена в заголовки.
кроме того, функции с пустым телом, такие как конструктор по умолчанию или по умолчанию, но виртуальный деструктор могут быть помещены в заголовки.
Я никогда не использую inline
потому что компилятор этого не гарантирует.