Probabilmente non dirò mai mai, ma le istruzioni che generano dati e codice mentre vengono analizzate non dovrebbero essere in un file .h.
Macro, funzioni e modelli in linea possono sembrare dati o codice, ma non generano codice mentre vengono analizzati, ma invece quando vengono utilizzati. Questi elementi spesso devono essere utilizzati in più di un file .c o .cpp, quindi appartengono alla .h.
A mio avviso, un file di intestazione dovrebbe avere l'interfaccia pratica minima per un corrispondente .c o .cpp. L'interfaccia può includere #definiti, classi, typedef, definizioni struct, prototipi di funzioni e definizioni esterne meno preferite per variabili globali. Tuttavia, se una dichiarazione viene utilizzata in un solo file sorgente, probabilmente dovrebbe essere esclusa da .h e essere contenuta nel file sorgente.
Alcuni potrebbero non essere d'accordo, ma i miei criteri personali per i file .h sono che includono tutti gli altri file .h che devono essere in grado di compilare. In alcuni casi, questo può essere un sacco di file, quindi abbiamo alcuni metodi efficaci per ridurre le dipendenze esterne come le dichiarazioni in avanti alle classi che ci permettono di usare i puntatori agli oggetti di una classe senza includere quello che potrebbe essere un grande albero di file include. / p>