c++ visual-c++ visual-studio-2005 include precompiled-headers

c++ - Cómo implementar encabezados precompilados en su proyecto



visual-c++ visual-studio-2005 (4)

"stdafx" es solo una convención. De ninguna manera es obligatorio. En una solución multiproyecto, he usado otras configuraciones con múltiples encabezados precompilados para diferentes partes. Por ejemplo, puede ser útil tener un PCH compartido por sus proyectos de UI, y otro para sus proyectos de base de datos.

Los componentes relevantes son el archivo Xh que enumera los encabezados precompilables, el archivo X.cpp que incluye solo Xh (y no agrega ningún código) y el archivo X.pch creado al compilar X.cpp (y por lo tanto Xh) con la opción de compilación /Yc .

Cuando está compilando el archivo Y.cpp con /Yu"X.pch" , el compilador lee y descarta todo hasta #include "Xh" . En ese punto, reemplaza su estado interno con el estado almacenado en X.pch, a excepción de la corriente de entrada (permanece Y.cpp, con el puntero de archivo establecido en la línea siguiente después de #include "Xh" ).

Entiendo el propósito y el razonamiento detrás de los encabezados precompilados. Sin embargo, ¿cuáles son las reglas al implementarlas? Según entiendo, dice algo como esto:

  1. Configure su proyecto para utilizar encabezados precompilados con la directiva YU.
  2. Cree su archivo stdafx.h y configúrelo como su encabezado precompilado.
  3. Incluya esto como la declaración de inclusión superior en cada uno de sus archivos .h.

Es esto correcto? ¿Debes excluir incluirlo en los archivos que están incluidos dentro de tu encabezado precompilado? Actualmente, obtengo el siguiente error de compilación cuando sigo mi intuición con esto:

error C2857: la instrucción ''#include'' especificada con la opción de línea de comandos /Ycstdafx.h no se encontró en el archivo fuente

Las opciones de línea de comandos son como tales:

/ 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


Su #include "stdafx.h" debe ser la primera línea de cada archivo cpp. No debe usarse en los archivos .h. Aparte de eso, tienes razón.


Visual Studio puede almacenar propiedades de encabezado precompiladas no solo por proyecto sino por archivo fuente.

De forma predeterminada, todas las propiedades están configuradas para "heredar de los valores predeterminados del proyecto primario" que solo muestra el valor del objeto principal para esa propiedad, pero una vez anulado en un nivel secundario (en este caso, un archivo .cpp) el archivo ignora los cambios de la propiedad principal .

La configuración que desea es:

  1. En el nivel del proyecto con "Todas las configuraciones" seleccionadas (propiedades del proyecto, cambiar la configuración desplegable desde la depuración / versión), configure su encabezado precompilado para "Usar"
  2. Elija un archivo .cpp para ser el origen del encabezado (hasta donde yo sé, no importa cuál)
  3. Haga clic derecho y vaya a propiedades, y seleccione "Crear" para el encabezado precompilado
  4. Finalmente, asegúrese de que ningún otro archivo .cpp tenga valores establecidos para la propiedad del encabezado precompilado (puede verlo en negrita)

Usted stdafx.cpp debe incluir stdafx.hy debe compilarse utilizando /Yc"stdafx.h" .

Su otro * .cpp debe incluir stdafx.h y debe /Yu"stdafx.h" utilizando /Yu"stdafx.h" .

Tenga en cuenta los caracteres de comillas dobles utilizados en las opciones del compilador.

Aquí hay una captura de pantalla de la configuración de Visual Studio para stdafx.cpp para crear un encabezado precompilado:

Estas son las opciones de línea de comando correspondientes (que son de solo lectura pero reflejan la configuración especificada en otras páginas; tenga en cuenta que el IDE inserta caracteres de comillas dobles alrededor del nombre del archivo, en la opción del compilador):

Esto es lo que está en mi archivo 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