language - use c++ in c




Dove inserire le istruzioni, l'intestazione o la fonte? (6)

C'è stato un bel po 'di disaccordo su questo nel corso degli anni. Un tempo, era tradizionale che un'intestazione dichiarasse solo ciò che era in qualsiasi modulo a cui era correlato, quindi molte intestazioni avevano requisiti specifici che #include un certo insieme di intestazioni (in un ordine specifico). Alcuni programmatori C estremamente tradizionali seguono ancora questo modello (religiosamente, almeno in alcuni casi).

Più di recente, c'è un movimento verso la maggior parte delle intestazioni standalone. Se quell'intestazione richiede qualcos'altro, l'intestazione stessa la gestisce, garantendo che tutto ciò di cui ha bisogno sia incluso (nell'ordine corretto, se ci sono problemi nell'ordinare). Personalmente, preferisco questo - specialmente quando l'ordine delle intestazioni può essere importante, risolve il problema una volta, invece di richiedere a tutti coloro che lo usano di risolvere il problema ancora una volta.

Nota che la maggior parte delle intestazioni dovrebbe contenere solo dichiarazioni. Ciò significa che l'aggiunta di un'intestazione non necessaria non dovrebbe (normalmente) avere alcun effetto sul tuo eseguibile finale. Il peggio che succede è che rallenta la compilazione un po '.

Devo inserire gli include nel file di intestazione o nel file sorgente? Se il file di intestazione contiene le istruzioni di inclusione, se includo il file di intestazione nella mia origine, il mio file di origine avrà tutti i file inclusi che erano nella mia intestazione? O dovrei semplicemente includerli solo nel mio file sorgente?


Crea tutti i tuoi file in modo che possano essere creati utilizzando solo ciò che includono. Se non hai bisogno di includere l'intestazione, rimuovilo. In un grande progetto, se non si mantiene questa disciplina, ti lasci aperto a rompere un'intera build quando qualcuno rimuove un'inclusione da un file di intestazione che viene utilizzato da un utente di quel file e nemmeno dall'intestazione.


I tuoi #include s dovrebbero essere di file header e ogni file (source o header) dovrebbe #include i file header di cui ha bisogno. I file di intestazione dovrebbero #include i file di intestazione minimi necessari e anche i file di origine, anche se non è così importante per i file di origine.

Il file sorgente avrà le intestazioni che #include , e le intestazioni che #include e così via fino alla massima profondità di annidamento. Questo è il motivo per cui non si desidera #include superflui nei file di intestazione: possono far sì che un file di origine includa molti file di intestazione che potrebbero non essere necessari, rallentando la compilazione.

Ciò significa che è del tutto possibile che i file di intestazione possano essere inclusi due volte e questo può essere un problema. Il metodo tradizionale consiste nel mettere "include guard" nei file di intestazione, come questo per il file foo.h:

#ifndef INCLUDE_FOO_H
#define INCLUDE_FOO_H
/* everything in header goes here */
#endif

Il tuo file sorgente avrà le istruzioni include se lo inserisci nell'intestazione. Tuttavia, in alcuni casi sarebbe meglio metterli nel file sorgente.

Ricorda che se includi quell'intestazione in qualsiasi altra fonte, otterranno anche gli include dall'intestazione, e ciò non è sempre auspicabile. Dovresti includere solo cose dove è usato.


L'approccio che ho sviluppato in oltre venti anni è questo;

Considera una biblioteca.

Vi sono più file C, un file H interno e un file H esterno. I file C includono il file H interno. Il file H interno include il file H esterno.

Vedete che dal compilatore POV, mentre compila un file C, c'è una gerarchia;

esterno -> interno -> codice C

Questo è l'ordine corretto, poiché ciò che è esterno è tutto ciò di cui una terza parte ha bisogno per usare la libreria. Quello che è interno è richiesto per compilare il codice C.


Metti solo include in un'intestazione se l'intestazione stessa ha bisogno di loro.

Esempi:

  • La tua funzione restituisce type size_t . Quindi #include <stddef.h> nel file di intestazione .
  • La tua funzione usa strlen . Quindi #include <string.h> nel file sorgente .




include