Нет ничего плохого в том, чтобы иметь функции в заголовочных файлах, если вы понимаете компромисс. Помещение их в файл заголовка означает, что их придется компилировать (и перекомпилировать) в любом модуле перевода, который включает заголовок. (и они должны быть объявлены inline
, иначе вы получите ошибки компоновщика.)
В проектах с большим количеством модулей перевода, это может привести к заметному замедлению во время компиляции, если вы делаете это много.
С другой стороны, это гарантирует, что определение функции будет видимым везде, где вызывается функция - и это означает, что оно может быть тривиально встроено, поэтому результирующая программа может работать быстрее.
И, наконец, с шаблонами функций у вас, как правило, нет реальной альтернативы. Определение должно быть видимым на сайте вызовов, и единственный практический способ добиться этого - поместить его в заголовок.
Последнее замечание заключается в том, что библиотеки только для заголовков проще в развертывании и использовании. Вам не нужно ссылаться на что-либо, вам не нужно беспокоиться о ABI или о чем-то еще. Вы просто добавляете заголовки в свой проект, включаете их и начинаете.
Многие популярные библиотеки используют стратегию только с заголовками.