Includi il proprio file di intestazione prima o l'ultima? Qualche ragione tecnica?

2

Stavo rivisitando la mia domanda Come posso evitare l'intestazione? , quando ho notato un commento che diceva

A good technique for ensuring a header is independent is having a rule that the source file always includes its own header first. This will catch cases where you need to move dependency includes out of the implementation file into the header file

Non sono sicuro di seguirla, e il contrario sembra essere stata la regola in tutto il mondo in cui ho lavorato. Non ci ho mai pensato, o l'ho interrogato.

Esistono motivi tecnici per un file .C o .CPP per #includere il proprio file di intestazione per l'ultima volta o non fa alcuna differenza?

Sto cercando ragioni tecniche, non opinioni. Niente con "il migliore", che sarebbe un'opinione. Le risposte che potrebbero aiutare a prevenire problemi durante il refactoring o l'aggiunta / rimozione di altri #inclusi sono i benvenuti.

    
posta Mawg 27.11.2018 - 10:20
fonte

2 risposte

4
Le direttive

#include vengono elaborate nell'ordine in cui vengono rilevate nelle origini. Concettualmente, quando viene rilevato un #include , tale direttiva viene sostituita con il contenuto del file di riferimento e dopo tale elaborazione continua con l'origine modificata (quindi, l'elaborazione continua sulla prima riga proveniente dal file incluso).

Se la primissima direttiva #include in un file sorgente è per l'intestazione che corrisponde a quel file sorgente, allora puoi essere sicuro che nessun'altra intestazione è stata ancora elaborata e puoi provare che l'intestazione non dipende da qualche altra intestazione è inclusa prima di esso.

Oltre a ciò, non fa alcuna differenza per il compilatore C o C ++ in cui sono elencati i file di intestazione dell'ordine, a condizione che venga rispettato il vincolo che ogni identificatore viene dichiarato prima di essere utilizzato.

    
risposta data 27.11.2018 - 10:55
fonte
2

Ci sono due opzioni per la struttura di intestazione che ho visto usate:

  1. Le intestazioni non includono le intestazioni . Questo approccio ha il vantaggio che le intestazioni sono leggere e non si ottiene un sacco di multi-inclusione inutile che rallenta le cose. È brutto perché è difficile da usare e instabile in fase di modifica. Ho bisogno di scoprire ogni include necessario da un file di intestazione per includerlo e se, in qualsiasi momento, l'intestazione ha bisogno di una nuova inclusione allora dovrò modificare ogni file che lo include.

  2. Le intestazioni includono tutto ciò di cui hanno bisogno per compilare . Questo metodo significa che posso sempre includere solo l'intestazione che voglio e funzionerà. Includere prima l'intestazione è semplicemente un modo per garantire che questo contratto sia soddisfatto . Poiché non c'è nulla incluso prima della prima inclusione nel file sorgente, l'inclusione garantisce che l'intestazione verrà compilata indipendentemente dalle altre intestazioni. Il lato negativo è un piccolo costo nel tempo di compilazione (che i compilatori moderni gestiscono abbastanza bene) e sebbene questo approccio sia stabile per aggiungere include, rimuovere gli include da un file di intestazione può causare file che includono quell'intestazione non riescono a compilare.

risposta data 28.11.2018 - 13:30
fonte

Leggi altre domande sui tag