Правила ввода функций в заголовочных файлах

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

каковы ваши правила для переноса функций из заголовочных файлов?

Если вам интересно, я говорю о разработке приложений, а не библиотек.

Edit:

Я думаю, это полезно, если я изложите плюсы / минусы встроенных (естественно) функций заголовка по сравнению с функциями реализации с моей точки зрения:

Pro inline:

  • более чистый/сжатый.
  • нет необходимости в дублировании подписи.
  • нет необходимости изменять любой Makefile для связи с новыми файлами.
  • мгновенная возможность ввести параметры шаблона.

Contra inline:

  • увеличенное время компиляции (мне все равно это много)
  • многие включают в заголовки (не должно быть такой большой проблемой, если они используют охранников)

согласно этому, кажется хорошей идеей поместить почти каждую функцию в заголовки, и я считаю, что это довольно близко к тому, что делают STL и Boost (хотя это библиотеки, в отличие от моего кода).

7 ответов


одно из моих самых нерушимых правил: в файлах заголовков разрешены только встроенные тела функций. Все остальное требует проблем с несколькими определениями на этапе связи.

заголовки следует оставлять преимущественно для объявлений, а не для определений. У меня есть исключения из этого правила (будучи гибким типом), но ни один из них не включает в себя не встроенные тела функций.


мое эмпирическое правило: "не в заголовке, если вам не нужно."А что касается удобства, считаете ли вы увеличение времени компиляции удобным?


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

Итак, вопрос сводится к:

inline в заголовке против out-of-line внутри файл реализации?

факторы:

  • вы говорите, что разрабатываете код уровня приложения, а не библиотеки, поэтому вам (в настоящее время) не нужно беспокоиться о том, что другие команды зависят от вашего кода, а также минимизировать их потребность в перекомпиляции (по сравнению с просто relink), сохраняя реализацию вне линии
    • но если вы пишете хороший код, который имеет потенциал, чтобы стать полезным для других команд, то вы могли бы найти себя желая бы реализация частного
  • inline против out-of-line обычно представляет собой накладные расходы порядка величины для тривиальных функций получения/набора данных... если у вас есть функции, которые вызываются повторно из критического кода производительности, то у вас есть причина предпочесть inlining
  • реализация в заголовке (особенно если она смешивается с объявлениями) часто может запутать API, но иногда на самом деле делает код более самодокументирование
  • локализация и удаленная избыточность (объединения объявлений/ определений) определенно устраняет потенциал для опечаток / ошибок и часто может повысить производительность

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


хороший стандарт кодирования подскажет вам реализовать методы и функции в исходном файле (cpp).

Если вы предпочитаете, вы можете реализовать шаблоны и встроенные функции в заголовке.


Так как это было помечено как C++, Почему бы вам не разделить их на логические classes?

обычно у меня есть один class объявление в заголовочном файле и его определение в соответствующем исходном файле.


два правила, которые я использую

1) Если это встроенные функции

2) Если это функция шаблон.


во-первых, функция шаблона должна быть помещена в заголовки.

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

Я никогда не использую inline потому что компилятор этого не гарантирует.