2009-08-24 2 views
5

Se inserisco un'intestazione (ah) in stdafx.h e quell'intestazione include un'altra intestazione (bh) che non è menzionata in stdafx.h, sarà visitata ogni volta che qualcuno include ah o è compilato come parte di ah? Se è compilato in a.h, cosa succede quando qualcuno include b.h direttamente? Questo sarà precompilato o no?Domanda sulle intestazioni precompilate in Visual C++

La mia motivazione per questa domanda è che sto cercando di ottimizzare il contenuto dei file stdafx.h per il software su cui lavoro. Sia la ricostruzione che i tempi di costruzione incrementali sono importanti per noi. Mi chiedevo se potevo semplicemente cercare tra tutti i file .cpp per le direttive #include e contare il numero di volte in cui ogni file è incluso. I file che sono stati inclusi spesso potrebbero essere buoni candidati per il file stdafx.h. Naturalmente, questa strategia è completamente falsa se devo considerare non solo quali file sono inclusi, ma anche quali file includono i file inclusi.

ne dubito conta, ma stiamo usando Visual Studio 2005.

+0

SI PREGA DI VOTO PER QUESTO: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4931119-allow-precompiled-headers-to-be-shared-between-pro –

risposta

4

a.h e b.h sarà parte di intestazione precompilata, e non v'è alcuna necessità di includere in un secondo momento. Tutto ciò che serve è includere stdafx.h dove sono richiesti a.h o b.h. Se includerai ah o bh esplicitamente dopo stdafx.h (tutto il codice prima che lo stdafx.h include sia ignorato), allora non verrà compilato una seconda volta (solo perché di solito sono protetti dalla direttiva #pragma once o definisce), ma il compilatore aprirai quel file sul disco rigido se lo chiedi,

A proposito, dovresti sapere che potresti usare diversi file di intestazione precompilati (ma non più di uno in ogni file cpp).

+3

Quello che dici su incluso ah o bh dopo che stdafx.h è tecnicamente vero - il compilatore guarderà di nuovo le intestazioni - ma la maggior parte delle intestazioni usa #pragma una volta o include guardie per impedire che ciò accada. In effetti, raccomanderei di includere a.h e b.h dovunque siano necessari anche se a.h è in stdafx.h, altrimenti non sarà possibile modificare i contenuti di stdafx.h in un secondo momento senza doverli inserire in una lista infinita di errori di compilazione. –

+0

Sì, non saranno compilati, ma verranno aperti dal compilatore tecnicamente. –

+1

Sono d'accordo L'idea di Nick è utile, ma temo solo che ci sia un impatto sulle prestazioni dato che dobbiamo fare un ulteriore I/O del disco per trovare una volta #progma –