Я, мабуть, ніколи не скажу ніколи, але заяви, які генерують дані та код під час їх розбору, не повинні містити .h файл.
Макроси, вбудовані функції та шаблони можуть виглядати як дані чи код, але вони не генерують код під час їх розбору, а замість того, коли вони використовуються. Ці елементи часто потрібно використовувати в більш ніж одному .c або .cpp, тому вони належать до .h.
На мій погляд, заголовок-файл повинен мати мінімальний практичний інтерфейс до відповідного .c або .cpp. Інтерфейс може включати #defines, class, typedef, визначення структур, прототипи функцій та менш бажані зовнішні визначення глобальних змінних. Однак якщо декларація використовується лише в одному вихідному файлі, вона, ймовірно, повинна бути виключена з .h і замість цього міститися у вихідному файлі.
Деякі можуть не погодитися, але мої особисті критерії для файлів .h полягають у тому, що вони # включають усі інші .h файли, які їм потрібно мати можливість складати. У деяких випадках це може бути багато файлів, тому у нас є кілька ефективних методів зменшення зовнішніх залежностей, таких як переадресація оголошень до класів, які дозволяють нам використовувати покажчики на об’єкти класу, не включаючи те, що може бути великим деревом файлів включення.