Nejspis jde o to, ze vicenasobny include musi preprocesovat a proparsovat celej soubor. Nekolikrat a opakovane, protoze co kdyby se nejaky #define zmenil.
V malem projektu muzete tyto veci odstranit tak, ze nebudete pouzivat ono magicke #ifndef _neco_h / #define _neco_h / #endif, takze donutite uzivatele neincludovat duplicitne, jinak budou errory.. ale ve velkem projektu se bez toho neda zit.
Ne, to není ten problém. Drtivá většina hlaviček má #pragma once nebo odpovídající #ifdef. A překladače tomu rozumí a ten soubor už podruhé v rámc překladu jednoho .c souboru ani neotevřou.
Problém je v tom, že pro překlad každého .c souboru je třeba posbírat hromadu hlaviček, takže se stejná hlavička kompiluje znova a znova pro každý zdrojový soubor v projektu. A tahle větev právě minimalizuje, kolik hlaviček jeden každý zdrojový soubor potřebuje pro svůj překlad.
Jiný způsob to řeší třeba tak, že se všechny .c soubory slepí do pár obrovských bloků a přeloží se ty. Říká se tomu unity buildy.