21

Capisco lo scopo e il ragionamento delle intestazioni precompilate. Tuttavia, quali sono le regole quando le implementano? Dalla mia comprensione, va qualcosa di simile:Come implementare le intestazioni precompilate nel progetto

  1. Imposta il progetto fino a utilizzare le intestazioni precompilate con la direttiva YU.
  2. Creare il file stdafx.h e impostarlo come intestazione precompilata.
  3. Includere questo come la dichiarazione di inclusione superiore in ciascuno dei file .h.

E 'corretto? Dovresti escludere l'inclusione nei file inclusi nell'intestazione precompilata? Attualmente, ottengo il seguente errore di compilazione quando si segue la mia intuizione con questo:

errore C2857: '#include' dichiarazione specificata con l'opzione della riga di comando /Ycstdafx.h non è stato trovato nel file sorgente

Le opzioni della riga di comando sono in quanto tali:

/od/I "../External/PlatformSDK/Include"/I ".."/I" ../ External/atlmfc/Include " /D" _DEBUG "/ D" _UNICODE "/ D" UNICODE " /Gm/EHsc/RTC1/MDd /Yc"stdafx.h" /Fp"....\Output\LudoCore \ Debug \ LudoCore.pch " /Fo" .... \ Output \ LudoCore \ Debug \ " /Fd"....\Output\LudoCore\Debug\vc80.pdb" /W4/WX/nologo/c/ZI/TP/wd4201 /errorReport: pronta

risposta

34

È stdafx.cpp dovrebbe includere stdafx.he essere costruito utilizzando /Yc"stdafx.h".

L'altro * .cpp deve essere incluso stdafx.h ed essere creato utilizzando /Yu"stdafx.h".

Nota i caratteri a virgolette usati nelle opzioni del compilatore!

Ecco una schermata delle impostazioni di Visual Studio per stdafx.cpp per creare un'intestazione precompilata:

create precompiled header

Ecco le corrispondenti opzioni della riga di comando (che sono di sola lettura, ma riflettono le impostazioni specificate su altre pagine, di notare che l'IDE inserisce caratteri a doppio virgolette intorno al nome del file, in opzione del compilatore):

options

Questo è ciò che è nel mio File Stdafx.cpp:

// stdafx.cpp : source file that includes just the standard includes 
// CallWinsock.pch will be the pre-compiled header 
// stdafx.obj will contain the pre-compiled type information 

#include "stdafx.h" 

// TODO: reference any additional headers you need in STDAFX.H 
// and not in this file 
+0

Stai dicendo che questo dovrebbe essere costruito solo a linea di comando? In Visual Studio, non sono sicuro di come creare qualcosa con una certa proprietà. Sembra sempre essere solo "Aggiungi -> Nuovo elemento -> Intestazione", ecc. – Chris

+0

Fare clic con il tasto destro del mouse sul file cpp e selezionare "Proprietà" nel menu di scelta rapida. Tra le pagine di proprietà di configurazione C++ ce n'è una per "Precompiled Headers", che usi per specificare che questo file CPP crea o usa un file di intestazione precompilato. – ChrisW

+0

Grazie per l'aggiornamento. Ho fatto come mostrato sopra e ancora nessun dado. Ecco le opzioni della riga di comando rispetto alla tua sopra:/Od/I "../External/PlatformSDK/Include"/I ".."/I "../External/atlmfc/Include"/D "_DEBUG"/D "_UNICODE"/D "UNICODE"/Gm/EHsc/RTC1/MDd /Yc"stdafx.h "/Fp"..\..\Output\LudoCore\Debug\LudoCore.pch"/Fo ".. \. . \ Output \ LudoCore \ Debug \\ "/Fd"..\..\Output\LudoCore\Debug\vc80.pdb"/W4/WX/nologo/c/ZI/TP/wd4201/errorReport: prompt – Chris

5

tuo #include "stdafx.h" dovrebbe essere la prima riga di ogni file cpp. Non dovrebbe essere usato nei file .h. A parte questo, hai ragione.

+0

Penso che il suo problema sta specificando /Ycstdafx.h invece di /Yc"stdafx.h ". – ChrisW

5

"stdafx" è solo una convenzione. Non è assolutamente obbligatorio. In una soluzione multi-progetto, ho utilizzato altre configurazioni con più intestazioni precompilate per parti diverse. Per esempio.può essere utile avere un PCH condiviso dai tuoi progetti di interfaccia utente e un altro per i tuoi progetti di database.

I componenti rilevanti sono il file Xh che elenca intestazioni precompilabili, il file X.cpp che include solo Xh (e non aggiunge codice stesso) e il file X.pch creato compilando X.cpp (e quindi Xh) con opzione del compilatore /Yc.

Quando si sta ora compilando il file Y.cpp con /Yu"X.pch", il compilatore legge e scarta tutto fino a #include "X.h". A quel punto sostituisce il suo stato interno con lo stato memorizzato in X.pch, ad eccezione del flusso di input (rimane Y.cpp, con il puntatore del file impostato sulla riga successiva dopo #include "X.h").

+0

Appena modificato per correggere un refuso. –

10

Visual Studio può memorizzare le proprietà dell'intestazione precompilate non solo per progetto ma per file di origine.

Per impostazione predefinita tutte le proprietà sono impostate su "eredita da padre o su valori predefiniti di progetto" che mostra solo il valore dell'oggetto genitore per quella proprietà, ma una volta annullato a livello figlio (in questo caso un file cpp) il file ignora le modifiche dalla proprietà genitore.

La configurazione che si desidera è:

  1. A livello di progetto con "tutte le configurazioni" selezionati (proprietà del progetto, la configurazione cambiamento goccia giù da debug/rilascio), impostare l'intestazione precompilata a "Usa"
  2. scegli un file cpp di essere la fonte della testata (per quanto ne so non importa quale)
  3. destra fare clic su proprietà e Goto, e selezionare "Crea" per intestazione precompilata
  4. Infine assicurarsi che nessun altro file .cpp ha valori impostati per i precompilati proprietà dell'intestazione (lo puoi dire con il testo in grassetto)
+0

Corretto un refuso: "per-compilato" corretto su "precompilato". –

Problemi correlati