21

Entiendo el propósito y el razonamiento detrás de los encabezados precompilados. Sin embargo, ¿cuáles son las reglas al implementarlas? Desde mi entender, es algo como esto:Cómo implementar encabezados precompilados en su proyecto

  1. Configure su proyecto para utilizar encabezados precompilados con la directiva YU.
  2. Crea tu archivo stdafx.h y configúralo como tu 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, me sale el siguiente error de compilación al seguir mi intuición con esto:

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

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

/Od/I "../External/PlatformSDK/Include"/I ".."/I" ../ Externo/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: pronta

Respuesta

34

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

Su otro * .cpp debe incluirse stdafx.hy construirse con /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:

create precompiled header

Aquí están las correspondientes opciones de línea de comandos (que son de sólo lectura, sino que reflejan los parámetros especificados en otras páginas, tenga en cuenta que el IDE inserta comillas dobles alrededor del nombre de archivo, en la opción de compilador):

options

Esto es lo que hay en mi stdafx.cpp archivo:

// 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 
+0

¿Está diciendo que esto solo debería construirse en la línea de comandos? En Visual Studio, no estoy seguro de cómo crear algo con una determinada propiedad desde el principio. Siempre parece ser solo "Agregar -> Nuevo elemento -> Encabezado", etc. – Chris

+0

Haga clic derecho en el archivo cpp y seleccione "Propiedades" en el menú contextual. Entre las páginas de propiedades de configuración C++, hay una para "Encabezados precompilados", que se utiliza para especificar que este archivo CPP crea o utiliza un archivo de encabezado precompilado. – ChrisW

+0

Gracias por la actualización. He hecho lo que se muestra arriba y todavía no hay dados. Aquí están las opciones de línea de comando con respecto a la suya anterior:/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 – Chris

5

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.

+0

Creo que su problema es especificar /Ycstdafx.h en lugar de /Yc"stdafx.h ". – ChrisW

5

"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. P.ej.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 los encabezados precompilables del listado Xh, 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 compilador opción /Yc.

Cuando estás ahora la compilación de archivos Y.cpp con /Yu"X.pch", el compilador lee y descarta todo lo que hasta #include "X.h". 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 siguiente línea después de #include "X.h").

+0

Acaba de editarse para corregir un error tipográfico. –

10

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 padres o proyectos por defecto" que solo muestra el valor del objeto principal para esa propiedad, pero una vez reemplazado 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. A nivel de proyecto con "Todas las configuraciones" seleccionadas (propiedades del proyecto, el cambio de caída de configuración debajo de depuración/release), ajuste el encabezado precompilado a "Use"
  2. Elige un archivo .cpp a ser la fuente de la cabecera (por lo que yo sé, no importa cuál)
  3. clic y Goto derecha propiedades, y seleccione "Crear" para el encabezado precompilado
  4. Finalmente asegurarse que ningún otro archivo .cpp tiene valores establecidos para el precompilado propiedad del encabezado (se puede ver por el texto en negrita)
+0

Corregido un error tipográfico: "por compilación" corregido en "precompilado". –

Cuestiones relacionadas