Encabezados precompilados en archivos de encabezado

 C Programming >> Programación C >  >> Tags >> File
Encabezados precompilados en archivos de encabezado


Me encontré con encabezados precompilados hoy por primera vez... cambiando mi vida para siempre. No puedo creer que compilar mi código C++ pueda ser tan rápido. Ahora tiene mucho sentido...


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 incluir archivo". Configuré esa opción del compilador en stdafx.h .


Después de hacer esto... ya no necesito incluir los encabezados que he agregado a mi stdafx.h , incluso dentro de mis archivos de encabezado (se supone que los archivos fuente incluyen automáticamente stdafx.h). ¿Es este el comportamiento esperado?


No puedo encontrar un lugar que sea claro en la distinción entre 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 se romperá en GCC. Y sí... tiene que ser portátil; al menos entre GCC y VC++.


Respuestas:


StdAfx.h realmente solo debería incluirse en los archivos de origen, no en los encabezados. Le sugiero 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 que conste, en realidad no uso encabezados precompilados en GCC, solo lo construyo normalmente y funciona bien.


Para algunos antecedentes. El compilador solo mira los archivos fuente (es decir, *.cpp, *.c, etc.) y cuando los compila tiene que incluir cada encabezado y compilar cualquier código que se encuentre en los encabezados también. 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 está 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.


Por lo tanto, dado que incluye StdAfx.h en cada archivo fuente como el 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 por tener un archivo StdAfx.h o incluir uno incorrecto.


Algunas respuestas de código


//header.hpp ... 
//source.cpp #include "header.hpp" ...