это правило хорошего тона. .h файл должен быть самодостаточным. Это
нужно чтобы если кто-то решил подключить ваш файл к себе в проект к
своему модулю ему не нужно было бы искать и подключать до этого .h
файла другие .h файлы чтобы его модуль скомпилировался без ошибок.
Поэтому все типы используемые в создаваемом .h файле должны быть
описаны в подключенных к нему .h -файлах. А чтобы быть уверенным,
что все подключил и не наподключал чего лишнего вот тут компиляция
и пригодится. линкер тут совсем ни при чем, это проверка синтаксиса.
Голова для рекурсии она конечно хорошо, но иногда бывает, что накосячишь, вот тут гард в конце и помогает найти где накосячил.