2011-09-02 1 views
8

Qual è il valore pratico ("cosa fa") di mettere #pragma hdrstop (nessun parametro filename) in un paio di file sorgente (cpp)?Cosa fa #pragma hdrstop senza parametro quando utilizzato in più file?

Si noti che il MSDN docs è (ancora una volta) chiaro come il fango per me.

Modifica/Nota: lo sto chiedendo, perché this answer e l'articolo a cui link sembrano raccomandarlo. Ma non capisco quale vantaggio debba avere un file separato per pch per ogni unità di compilazione.

risposta

10

La risposta alla domanda originale è che lo scopo di avere #pragma hdrstop in un file con/Yc o/Yu set è che è ignorato e quindi è possibile impostare una configurazione di build che costruisca senza intestazioni precompilate e altro crea configurazioni che creano intestazioni precompilate e non è necessario modificare il codice o le intestazioni incluse per farlo.

Più dettagli ...

Le note su MSDN dicono che "Il pragma hdrstop offre un controllo aggiuntivo sui nomi dei file di precompilazione e sulla posizione in cui lo stato della compilazione viene salvato." Il che è vero, ma non è particolarmente evidente esattamente come utili che possono essere ...

In poche parole.

  • L'inserimento di #pragma hdrstop in un file di origine non compilato con/Yc o/Yu non ha alcun effetto.
  • Se hai/Yu impostare per il file quindi hdrstop dice al compilatore di buttare via tutto prima la linea sulla quale appare hdrstop e inserire l'intestazione precompilata invece.
  • Se/Yc è impostato per il file allora hdrstop significa salvare tutto lo stato compilato per tutto fino alla riga su cui hdrstop appare come intestazione precompilata.

Il trucco sta utilizzando/Yc e/Yu senza il nome del file di intestazione opzionale; basta selezionare il pulsante di opzione "usa" o "crea" e lasciare vuota la casella di testo "Intestazione passante" (o modificare il file di progetto ...).

Quindi si ha 1 file, eventualmente chiamato PrecompiledHeader.cpp che include le intestazioni che si desidera includere nell'intestazione precompilata e che ha #pragma hdrstop alla fine dell'elenco dei file di inclusione. Questo file ONE è compilato con/Yc.

Devi quindi tutti gli altri file cpp con #pragma hdrstop dopo la includono i file che si trovano nella vostra intestazione precompilata. Questi file sono tutti compilati con/Yu.

Questo si traduce in PrecompiledHeader.cpp costruire la vostra (in questo esempio) singolo file PCH e tutti gli altri file utilizzando il file singolo pch.

Il vantaggio di questa operazione è che nessuno dei vostri file devono includere un 'globale' intestazione del file di intestazione precompilata edificio - quindi non stdafx.h o qualsiasi altra cosa. Ciò significa che è possibile impostare una configurazione di build che genera SENZA intestazioni precompilate in cui tutte le righe di #pragma hdrstop vengono semplicemente ignorate.

Questo è "buono" perché significa che è possibile avere una configurazione di configurazione "senza precomp" singola che consente di sviluppare rapidamente (è possibile modificare una singola intestazione e NON forzare la ricostruzione del mondo) e altre configurazioni "normali" che DO usa intestazioni precompilate.

+0

Grazie. Grazie mille! ... Ora, hmm ... * "Poi hai tutti gli altri tuoi file cpp con #pragma hdrstop dopo i file di inclusione che sono nell'intestazione precompilata." * - questo significa che gli altri file devono sapere cosa c'è nel intestazione precompilata in modo che possano dividere i loro include prima e dopo la linea hdrstop? –

+2

Funziona meglio se lo fai. Ma tu non devi. Avrai errori di compilazione nelle tue build precomp se hai un file che si trova sopra il #pragma hdrstop che non si trova nell'intestazione precompilata. Puoi quindi decidere se è usato abbastanza ampiamente da meritare di essere nel precomp o no. –

5

Tutto il codice prima dello #pragma hdrstop farà parte di un'intestazione precompilata. Se viene fornito il parametro nome file, il nome dell'intestazione sarà il nome di base del file sorgente con estensione PCH, come accennato in the documentation:

Il nome del file di intestazione precompilata è determinato secondo la seguenti regole, in ordine di precedenza:

  1. l'argomento per l'opzione del compilatore/Fp

  2. l'argomento nome del file da #pragma hdrstop

  3. Il nome di base del file sorgente con estensione PCH

Quindi, se avete che su un file chiamato blah.cpp produrrà un file chiamato blah.pch, IFF compilato con /Yc (che solo un file dovrebbe essere impostato).

+0

Questo è il tipo di cosa che accade quando si ignora opzioni 0, 1 e 2. Uso/Yu è piuttosto universale, opzione 0. –

4

Se non si utilizza #pragma hdrstop nel progetto C/C++, è necessario disporre di un file .cpp dedicato come file di origine per .pch creato.

Se si utilizza #pragma hdrstop in un file cpp con il quale si desidera creare il file PCH, il file cpp può avere altri contenuti utili dopo la linea di #pragma hdrstop. Quando si compila per la prima volta questo file .cpp con l'opzione di compilazione/Yc, si ottiene il file .pch e il file obj. Quando modifichi il file .cpp e ricompilalo con l'opzione di compilazione/Yu, il compilatore sostituisce il contenuto prima della riga di #pragma hdrstop con il file .pch e ricompila la parte dopo la riga di #pragma hdrstop, crea un nuovo file obj, salvando la compilazione tempo. È molto utile che il tuo progetto abbia l'unico file sorgente.

Per i file di origine utilizzando solo i file di testa di precompilazione, il #pragma hdrstop è un punto di riferimento per il compilatore quale parte dovrebbe essere sostituito dal file PCH, quindi non è necessario indicare il nome del file di intestazione opzione di compilazione Yu con /.

+0

Grazie. Questa risposta sta facendo * un po '* senso. Quindi è necessario compilare lo * stesso * cpp file con diversi switch del compilatore perché ciò abbia senso? –

+0

Sì. Un progetto C/C++ può utilizzare più di un file .pch. È possibile specificare il .pch per ogni file sorgente mediante l'opzione di compilazione/Yu o il #pragma hdrstop. – ligand

+0

Questo ho capito. Quello che intendevo chiedere era: avere questo senso, per avere un 'U.cpp' che è sempre compilato con'/Yu' e un altro 'C.cpp' che è sempre compilato con'/Yc'? * O * abbiamo un singolo 'UC.cpp' che è compilato una volta con'/Yc' e poi con '/ Yu' ?? –