2012-07-09 8 views
11

Oggi mi sono imbattuto in intestazioni precompilate per la prima volta ... sempre per cambiare la mia vita. Non posso credere che la compilazione del mio codice C++ potrebbe essere così veloce. Ha perfettamente senso ora ..Intestazioni precompilate nei file di intestazione

In ogni caso, una cosa che mi confonde è che da quello che ho letto finora, solo le intestazioni precompilate dovrebbero essere aggiunte ai file sorgente (cpp?).

In Visual Studio, è disponibile un'opzione in Proprietà progetto-> C/C++ -> Avanzate in "Forza inclusione file". Ho impostato l'opzione del compilatore su stdafx.h.

Dopo aver eseguito questa operazione, non è più necessario includere le intestazioni che ho aggiunto al mio stdafx.h, anche all'interno dei file di intestazione (i file di origine dovrebbero includere automaticamente stdafx.h). È questo comportamento previsto?

Non riesco a trovare un posto che sia chiaro nella distinzione tra file di intestazione/origine.

Se lo fa..grande, ma temo che sia un'altra di quelle cose che VC++ ti consente di farla franca ma che si interromperà in GCC. E sì..it deve essere portatile; almeno tra GCC e VC++.

+1

Bene, se vuoi che il tuo progetto funzioni anche su gcc, allora ti conviene stare lontano dall'opzione "Forza inclusione file". Boilerplate consiste nel fare il primo #include nel file del codice sorgente del file di intestazione precompilato. –

+2

@Hans, la funzione gcc equivalente sarebbe usare l'opzione della riga di comando '-include' per includere * stdafx.h * all'inizio di ogni file. –

risposta

13

StdAfx.h deve essere solo incluso nei file di origine, non nelle intestazioni. Ti suggerisco #include "StdAfx.h" prima in ogni cpp e non utilizzare l'opzione "Forza inclusione file". Ecco come lo faccio con i miei progetti multipiattaforma. Per la cronaca, in realtà non utilizzo intestazioni precompilate in GCC, ma lo compilo normalmente e funziona bene.

Per alcuni sfondi. Il compilatore guarda solo i file sorgenti (es. * .cpp, * .c, ecc.) E quindi quando li compila deve includere ogni intestazione e compilare qualsiasi codice trovato nelle intestazioni. L'opzione di intestazioni precompilate consente di compilare tutto il codice (ad esempio, il codice globale di inclusione in StdAfx.h) una volta, in modo da non doverlo fare tutto il tempo. Ecco a cosa serve StdAfx.cpp. Il compilatore compila StdAfx.cpp con tutto il codice incluso in StdAfx.h una volta invece di doverlo fare ogni volta che si costruisce.

Quindi, poiché si include StdAfx.h in ogni file di origine come primo elemento, non ha senso includerlo in nessuna delle intestazioni poiché verranno inclusi DOPO StdAfx.h e quindi avranno accesso a tutto il codice in StdAfx.h. Inoltre, è possibile utilizzare tali intestazioni in altri progetti senza doversi preoccupare di avere uno StdAfx.h in giro o di includere quello sbagliato.

+0

La mia domanda era che VC++ li aggiungesse automaticamente alle intestazioni? Non ho errori quando uso tipi che non ho incluso (ma sono nello stdafx.h) .. molto strano. – irwinb

+2

No, l'opzione include force aggiunge il file alla prima riga di ogni file source/cpp. Il modo include lavoro è il contenuto del file da includere viene inserito nel file di origine nella posizione del # include. Con l'opzione force include che renderebbe in cima a ogni file CPP il contenuto di StdAfx.h, seguito dal contenuto di tutti i file di intestazione e il codice sorgente (in qualunque ordine si trovi nel file). Quindi l'effetto è, tutto ciò che è definito nel tuo StdAfx.h sarà disponibile nelle tue intestazioni, all'interno di quel progetto. Il compilatore guarda solo i file di origine e non le intestazioni. – syplex

+0

Oh capisco. Questo ha perfettamente senso. Grazie alla tua spiegazione. – irwinb

4

Sì, è il comportamento previsto. Il Properties- Progetto> C/C++ -> Avanzate per "Forza includere il file" controlli di impostazione Visual C++ compiler option /FI:

Questa opzione ha lo stesso effetto di specificare il file con doppie virgolette in una direttiva # include il primo linea di ogni file sorgente

Così, si libera dall'includere manualmente lo stdafx.h.

Sebbene sia possibile utilizzare intestazioni precompilate con GCC e altri compilatori Il comportamento di collegamento di Visual C++ non è trasferibile su altri compilatori. Quindi, controlla How to handle stdafx.h in cross-platform code? dove vengono discusse le idee per le soluzioni portatili.

Per farla breve, includere stdafx.h manualmente nei file di origine .cpp e si dovrebbe andare bene anche con GCC (presupponendo, si configurerà la build per GCC per utilizzare le intestazioni precompilate).

+0

Annunci in entrambi i file .h e .cpp? – irwinb

+0

@irwinb In file .cpp. Anche la risposta è stata aggiornata. – mloskot

+0

Se si aggiunge solo ai file .cpp, perché VC++ va bene con me avendo la decelerazione di quei tipi nei miei file di intestazione senza includerli? – irwinb

2

Non utilizzare l'impostazione "Forza inclusione file" (/ FI) durante l'interruzione Modifica & Continua! (e MS non sembra voler risolvere questo problema)

Vedi https://connect.microsoft.com/VisualStudio/feedback/details/668339/vs-2010-sp1-c-edit-and-continue-fails-with-fi

e https://connect.microsoft.com/VisualStudio/feedback/details/342441/visual-studio-2005-force-includes-breaks-edit-and-continue-with-pre-compiled-headers

#include "stdafx.h" si deve trovare solo come la prima riga non di commento nei file di origine, non nei file di intestazione.