Probablemente nunca diría nunca, pero las declaraciones que generan datos y código a medida que se analizan no deberían estar en un archivo .h.
Las macros, las funciones en línea y las plantillas pueden parecer datos o código, pero no generan código a medida que se analizan, sino que se usan cuando se usan. Estos elementos a menudo deben usarse en más de un .c o .cpp, por lo que pertenecen al .h.
En mi opinión, un archivo de encabezado debe tener la interfaz práctica mínima para un correspondiente .c o .cpp. La interfaz puede incluir #defines, clase, typedef, definiciones de estructura, prototipos de funciones y definiciones externas menos preferidas para variables globales. Sin embargo, si una declaración se usa en un solo archivo fuente, probablemente debería excluirse del .h y estar contenida en el archivo fuente.
Algunos pueden estar en desacuerdo, pero mi criterio personal para los archivos .h es que #incluyen todos los demás archivos .h que necesitan para poder compilar. En algunos casos, esto puede ser una gran cantidad de archivos, por lo que tenemos algunos métodos efectivos para reducir las dependencias externas, como las declaraciones directas a clases que nos permiten usar punteros a objetos de una clase sin incluir lo que podría ser un gran árbol de archivos de inclusión.