2012-05-21 17 views
6

Ho eseguito alcune ricerche e ho trovato thread simili sul modo corretto di includere i file di intestazione in C++, ma nessuno di loro ha risposto a questa domanda.#include file di intestazione quando si trovano in una struttura di directory diversa

so che, al fine di includere un file di intestazione in un'altra cartella si può semplicemente utilizzare la seguente sintassi:

#include "../myFolder/myFile.h" 

Ma che dire quando il file si trova in una struttura di directory diversa un po 'lontana? Per esempio, se qualcosa di simile al seguente è garantito per essere vero:

attuale directory =/F1/F2/F3/F4/F5/MyFile.cpp

directory intestazione desiderata =/f1/D2/D3/d4/d5/d6/myHeader.h

So che è possibile impostare la proprietà "Additional Include Directories" o utilizzare un file make, ma mi piacerebbe sapere se c'è un modo per farlo dal #include dichiarazione.

+1

Puoi ovviamente mettere l'intero percorso relativo o assoluto nella tua istruzione di inclusione (che non consiglierei), ma sospetto che tu stia cercando qualcosa di un po 'più compatto? – JohnMcG

+0

Grazie per il commento! Sto cercando di vedere se c'è un modo per farlo e ancora di essere relativo, in modo che non importa ciò che è sopra f1 (in questo esempio) nella struttura delle directory. – user1205577

+0

Bene, puoi mettere insieme le stringhe ".." per es. '#include ../../../../../../ f2/f3/f4/f5/myFile.cpp' che è così brutto che mi pento immediatamente di averlo scritto. Ti consigliamo di impostare il percorso di inclusione nel makefile. – JohnMcG

risposta

10

mettere ".." in #include è generalmente considerato brutto e non gestibile.

Ogni libreria coerente che si sta utilizzando (ad esempio boost) ha una singola radice della gerarchia dei file di intestazione che è necessario inserire nella proprietà "directory di inclusione aggiuntive". Per impulso è qualcosa di simile

`C:/lib/boost_1_49` 

in questa directory di solito trovare una directory chiamata boost in cui tutte le intestazioni vivono. Questo porta la convenzione con cui tutti gli header di boost iniziano con:

#include <boost/bla/bla.hpp> 

Questo vale anche per lo stesso progetto che si sta scrivendo. Dovresti decidere qual è la radice migliore per le intestazioni e avviare tutti gli include da lì.
L'unica eccezione a questa regola dovrebbe essere intestazioni che si trovano nella stessa directory. Questi possono essere inclusi solo come nome file #include "same-dir-header.h"

È inoltre necessario fare la differenza tra l'inclusione di "" e <>. Le virgolette dovrebbero essere cose nel tuo progetto, le parentesi angolari dovrebbero essere librerie esterne (o come alcune vorrebbe - librerie di runtime OS e C)

+0

Il trucco qui è che la struttura della directory è garantita per essere la stessa relativamente, ma dove sulla macchina vivrà l'intera cosa non lo è. Sembra sempre più come un file make, ma volevo solo sapere se era possibile. – user1205577

+1

È anche * genuinamente * non portatile. Una volta stavamo provando a scrivere codice per lavorare con due compilatori: uno relativo include include nei file '.h' relativi alla posizione del file' .h', e l'altro ha valutato lo stesso include relativo al file '.c' . Includere percorsi sono la strada da percorrere. Il problema di base è che il significato di '..' e'/'in include le direttive è definito dall'implementazione. –

0

Per completare la risposta da @shoosh, devi dire al tuo compilatore dove sono quelle "altro" file di intestazione. Con gcc su Windows, se si trovano in c: \ percorso \ a \ biblioteca, quindi aggiungere l'opzione -I

-Ic: \ percorso \ a \ biblioteca

Attenzione spazi nel percorso , prende il c: \ mio path \ to \ libreria, quindi:

-I "c: \ My_Path \ a \ library"

altri compilatori fornirà un'opzione simile, in linea di comando o attraverso l'IDE.

Problemi correlati