Случаи, когда код пишется в заголовочных файлах:
Шаблонные функции и классы (Template Functions and Classes): Компилятору требуется знать весь код шаблона для его конкретизации при использовании.
c
Встраиваемые (inline) функции: Компилятор может заменить вызов функции на ее тело, что требует наличия кода функции в месте ее использования. Ключевое слово inline — лишь рекомендация компилятору.
c
Константные переменные с внутренней компоновкой (static const / constexpr): Такие переменные обычно определяются и инициализируются прямо в заголовочном файле.
c
Объявления и определения статических членов-констант (static const member variables): Для интегральных типов их можно инициализировать прямо в объявлении внутри класса.
c
Некоторые виды макросов: Хотя использование макросов следует минимизировать в пользу constexpr, они могут определяться в заголовочных файлах для распространения по проекту.
c
Мелкие функции-аксессоры или геттеры/сеттеры: Иногда, для повышения производительности или удобства, небольшие функции могут быть определены в заголовочном файле, часто с implicit или explicit inline.
c
Дублирование определений функций или переменных с внешней компоновкой в заголовочных файлах приводит к ошибкам компоновки (One Definition Rule violation), за исключением вышеперечисленных случаев.