Ich würde wahrscheinlich nie nie sagen, aber Anweisungen, die Daten und Code generieren, während sie analysiert werden, sollten nicht in einer .h-Datei enthalten sein.
Makros, Inline-Funktionen und Vorlagen sehen möglicherweise wie Daten oder Code aus, generieren jedoch keinen Code, wenn sie analysiert werden, sondern wenn sie verwendet werden. Diese Elemente müssen häufig in mehr als einer .c- oder .cpp-Datei verwendet werden, sodass sie in die .h-Datei gehören.
Meiner Ansicht nach sollte eine Header-Datei die minimale praktische Schnittstelle zu einer entsprechenden .c- oder .cpp-Datei haben. Die Schnittstelle kann #defines, class, typedef, Strukturdefinitionen, Funktionsprototypen und weniger bevorzugte externe Definitionen für globale Variablen enthalten. Wenn eine Deklaration jedoch nur in einer Quelldatei verwendet wird, sollte sie wahrscheinlich aus der .h-Datei ausgeschlossen und stattdessen in der Quelldatei enthalten sein.
Einige mögen anderer Meinung sein, aber mein persönliches Kriterium für .h-Dateien ist, dass sie alle anderen .h-Dateien enthalten, die sie kompilieren müssen. In einigen Fällen kann dies eine Vielzahl von Dateien sein. Daher verfügen wir über einige effektive Methoden, um externe Abhängigkeiten wie Forward-Deklarationen für Klassen zu reduzieren, mit denen wir Zeiger auf Objekte einer Klasse verwenden können, ohne einen möglicherweise großen Baum von Include-Dateien einzuschließen.