2014-05-14 14 views
6

Ho creato una libreria condivisa (.dll) da un codice sorgente C++.Quando si utilizza una libreria DLL, è necessario includere tutte le intestazioni utilizzate per compilare la DLL?

Ora, quando voglio utilizzare questa libreria in un altro programma, è necessario includere tutti i file di intestazione che sono stati utilizzati originariamente per creare la libreria o includere solo le intestazioni che appartengono alle funzioni utilizzate nel mio (nuovo) il programma è sufficiente? Ci sono molte funzioni nella libreria che non sono usate direttamente nel nel mio nuovo programma, ma, inutile dirlo, tutte sono usate dalle funzioni nel programma.

(Così sono indirettamente utilizzati nel programma anche, e sarebbe strano se la loro inclusione non è necessario.)

risposta

10

file di intestazione sono nulla di magico, sono solo un modo conveniente per garantire il file .cpp ha accesso a tutte le dichiarazioni e definizioni di cui ha bisogno. Quindi includi solo quelli effettivamente necessari in ciascuno dei tuoi file (1).

Quanto sopra si riferisce all'inserimento delle istruzioni #include nei file, solo per i file di intestazione che è effettivamente necessario utilizzare. Ovviamente, i file di intestazione inclusi possono contenere gli stessi file di intestazione #include.

Come qualsiasi altra DLL ben educata (vale a dire effettivamente utilizzabile), la DLL deve fornire un set di file di intestazione dell'interfaccia pubblica. In circostanze normali, è necessario disporre di tutti questi file di intestazione dell'interfaccia pubblica disponibili per la creazione di un programma utilizzando tale DLL. Ciò non significa che dovresti tutti #include; al contrario, non dovresti. Il compilatore (il preprocessore, in realtà) sarà lo #include di cui ha bisogno.

Si noti che quando è stata creata la DLL stessa, erano probabilmente presenti molti altri file di intestazione, ma questi erano privati ​​dell'implementazione e non facevano parte dell'interfaccia pubblica. Non hai bisogno di loro per creare un programma usando la DLL, e nel caso generale non hai nemmeno accesso ad essi.

Quindi, quando si progetta la propria DLL, è necessario differenziare rigorosamente tra i file di intestazione pubblici e interni. I file di intestazione pubblica devono essere resi disponibili ai client, quelli interni non ne hanno bisogno (a meno che il client non sia in grado di creare autonomamente la DLL). Ovviamente, ciò significa che un file di intestazione pubblico non può mai essere uno #include interno.


(1) noti che intestazione del file inclusione è puramente testuale, quando si legge il file di origine, il preprocessore efficacemente copia il contenuto del file di intestazione e l'incolla in luogo della dichiarazione #include, poi va avanti parsing. Hai fatto questa copia & incollala invece, il file sarebbe costruito ed eseguito altrettanto bene. Ovviamente, non raccoglierebbe le modifiche successive nel file di intestazione, che è il motivo principale per cui i file di intestazione vengono utilizzati in primo luogo.

+0

Tuttavia, molte intestazioni sono incluse nelle intestazioni delle funzioni che chiamo (e includono l'intestazione corrispondente). Come il compilatore sa di loro? – user215721

+0

@ user215721 Le istruzioni '# include' nei file di intestazione della DLL verranno risolte come qualsiasi altra istruzione' # include'. Espanderò la risposta un po ', forse ci riferiremo ai diversi significati della parola "include". – Angew

+0

Grazie mille. La tua ultima frase in realtà mi ha dato la risposta: * Ovviamente, questo significa che un file di intestazione pubblico non può mai # # includere uno interno. * Ora devo rendere molte delle mie intestazioni interne copiando il loro codice al posto di ' # include 's in altri pubblici. – user215721

Problemi correlati