La maggior parte dei file di intestazione C e C ++ (in particolare le intestazioni di sistema o quelle di grandi librerie C ++ come Qt ) hanno #include guards o non standard #pragma once . In pratica, le intestazioni standard di C ++ come <set> o <map> vengono spesso espanse ad almeno diecimila righe ciascuna.
Quindi, quando alcune unità di traduzione (come unity.cpp ) includono alcuni dati di un file di intestazione foo.h più volte, viene incluso solo una volta (la prima occorrenza del suo #include ).
Quindi, la forma pre-elaborata di unity.cpp è più breve (in token pre-elaborati) della somma della forma preelaborata di ciascuno di a.cpp , b.cpp , c.cpp .
E potreste verificarlo ottenendo il loro modulo pre-elaborato. Con GCC che useresti (magari aggiungendo altri opzioni del preprocessore come -I ... per aggiungere una directory include, -D ... per definire un simbolo del preprocessore, -H per ottenere il percorso dei file inclusi, ...)
g++ -C -E a.cpp > a.ii
g++ -C -E b.cpp > b.ii
g++ -C -E c.cpp > c.ii
g++ -C -E unity.cpp > unity.ii
e potresti confrontare il conteggio delle parole cumulato ottenuto da wc a.ii b.ii c.ii con quello di wc unity.ii
(Ti lascio adattare questi comandi Linux al tuo cl compilatore e Windows)
Tuttavia, la presenza di più unità di traduzione abilita le build parallele (in diversi processi eseguiti simultaneamente), ad es. con make -j .
(Quindi, in termini pratici, potresti volere un po 'di compromesso, ho l'abitudine di avere *.cc di file di qualche migliaio di righe)
You might say that the order of includes, undefs, and other weird shit can matter, but that's the pathological/exceptional case.
Non sono sicuro che sia patologico. Su Linux, presumo che potrebbe essere abbastanza comune. Vedi feature_test_macros (7)
You could still detect a well behaved header file and cache it
In pratica, questo non funziona bene. All'interno di GCC, alcune persone intelligenti hanno lavorato su intestazioni prepagate senza successo . I futuri standard C ++ potrebbero definire moduli (vedi anche Clang documentation su di essi )
NB: Sto rispondendo con un Linux & Vista centrica GCC, ma è possibile adattare la risposta al proprio Visual C ++ e amp; Windows (che non conosco) perché è molto più un problema linguistico (e pratico) di un sistema operativo e amp; compilatore uno.