2012-07-09 19 views
11

Hoy entré en encabezados precompilados por primera vez ... por lo que estoy cambiando mi vida. No puedo creer que compilar mi código C++ sea tan rápido. Tiene sentido total ahora ...Encabezados precompilados en archivos de encabezado

De todos modos, una cosa que me confunde es que, por lo que he leído hasta ahora, los encabezados precompilados solo deben agregarse a los archivos fuente (cpp?).

En Visual Studio, hay una opción en Propiedades del proyecto-> C/C++ -> Avanzado para "Forzar archivo de inclusión". Establecí esa opción del compilador en stdafx.h.

Después de hacer this..I ya no se requiere para incluir las cabeceras he añadido a mi stdafx.hy, incluso dentro de mis archivos de cabecera (archivos de origen se supone que incluirá automáticamente stdafx.hy). ¿Es este comportamiento esperado?

No encuentro un lugar que sea claro en la distinción entre los archivos de encabezado/fuente.

Si lo hace ... genial pero me temo que es otra de esas cosas que VC++ te permite salirte con la tuya pero que se romperá en GCC. Y sí ... debe ser portátil; al menos entre GCC y VC++.

+1

Bueno, si quieres que tu proyecto también funcione en gcc, será mejor que te mantengas alejado de la opción "Forzar incluir archivo". Boilerplate es hacer el primer #include en su archivo de código fuente el archivo de encabezado precompilado. –

+2

@Hans, la característica equivalente de gcc sería usar la opción '-include' de la línea de comando para incluir * stdafx.h * al comienzo de cada archivo. –

Respuesta

13

StdAfx.h realmente solo se debe incluir en los archivos fuente, no en los encabezados. Sugeriría que # incluya "StdAfx.h" primero en cada cpp y no use la opción "Forzar incluir archivo". Así es como lo hago con mis proyectos multiplataforma. Para el registro, en realidad no uso encabezados precompilados en GCC. Lo construyo normalmente y funciona bien.

Para obtener más información. El compilador solo mira los archivos fuente (es decir, * .cpp, * .c, etc.) y cuando los compila debe incluir cada encabezado y compilar cualquier código que se encuentre en los encabezados. La opción de encabezados precompilados permite compilar todo ese código (es decir, el código incluido globalmente en StdAfx.h) una vez para que no tenga que hacerlo todo el tiempo. Para eso es StdAfx.cpp. El compilador compila StdAfx.cpp con todo el código incluido en StdAfx.h una vez, en lugar de tener que hacerlo cada vez que compila.

Así que, ya que incluye StdAfx.h en cada archivo fuente como primer elemento, no tiene sentido incluirlo en ninguno de los encabezados, ya que se incluirán después de StdAfx.h y, por lo tanto, tendrán acceso a todo el código en StdAfx.h. Además, puede usar esos encabezados en otros proyectos sin tener que preocuparse de tener un StdAfx.h alrededor o incluir el incorrecto.

+0

Mi pregunta fue: ¿VC++ agrega estos automáticamente a los encabezados? No obtengo errores cuando uso tipos que no he incluido (pero están en stdafx.h) ... muy raro. – irwinb

+2

No, la opción de incluir fuerza agrega el archivo a la primera línea de cada archivo fuente/cpp. La forma en que se incluye el trabajo es que los contenidos del archivo que se va a incluir se coloquen en el archivo fuente en la ubicación del #include. Con la opción de incluir fuerza, todos los archivos CPP tendrán los contenidos de StdAfx.h en la parte superior, seguidos del contenido de todos los archivos de encabezado y el código fuente (en cualquier orden en el archivo). El efecto es que todo lo definido en su StdAfx.h estará disponible en sus encabezados dentro de ese proyecto. El compilador solo mira los archivos fuente, no los encabezados. – syplex

+0

Oh, ya veo. Eso tiene perfecto sentido. Gracias a tu explicación. – irwinb

4

Sí, es el comportamiento esperado. El Proyecto Properties-> C/C++ -> Avanzado para "Fuerza archivo de inclusión" controles de ajuste Visual C++ compiler option /FI:

Esta opción tiene el mismo efecto que especificar el archivo con dobles comillas en una directiva #include en el primer línea de cada archivo fuente

Por lo tanto, lo libera de incluir manualmente stdafx.h.

Aunque, puede usar encabezados precompilados con GCC y otros compiladores El comportamiento de acceso directo de Visual C++ no es portátil en otros compiladores. Por lo tanto, consulte How to handle stdafx.h in cross-platform code? donde se discuten ideas para soluciones portátiles.

En resumen, incluya stdafx.h manualmente en sus archivos fuente .cpp y también debería estar bien con GCC (suponiendo que configure su compilación para que GCC use encabezados precompilados).

+0

¿Anuncios a los archivos .h y .cpp? – irwinb

+0

@irwinb A archivos .cpp. Respuesta actualizada también – mloskot

+0

Si solo se agrega a los archivos .cpp, ¿por qué VC++ está de acuerdo con que tenga desaceleración de esos tipos en mis archivos de encabezado sin incluirlos? – irwinb

2

No utilice la configuración "Forzar incluir archivo" (/ FI) mientras se rompe Editar & ¡Continuar! (y MS no parece querer solucionar este problema)

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

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

#include "stdafx.h" sólo debe conocer como la primera línea no comentario en los archivos de origen, no en archivos de encabezado

Cuestiones relacionadas