2011-09-02 10 views
8

¿Cuál es el valor práctico ("qué hace") de poner #pragma hdrstop (parámetro sin nombre de archivo) en un par de archivos fuente (cpp)?¿Qué hace #pragma hdrstop sin parámetro cuando se usa en varios archivos?

Tenga en cuenta que MSDN docs son (una vez más) tan claros como el barro para mí.

Editar/Nota: Estoy preguntando esto, porque this answer y el artículo al que lo vincula parecen recomendarlo. Pero no entiendo qué beneficio tiene tener un archivo separado de pch para cada unidad de compilación.

Respuesta

10

La respuesta a la pregunta original es que el propósito de tener #pragma hdrstop en un archivo que no tiene/Yc o/Yu establecido es que se ignora y puede configurar una configuración de compilación sin encabezados precompilados y otros construya configuraciones que compilen con encabezados precompilados y no necesita cambiar el código o los encabezados que están incluidos en absoluto para hacerlo.

Más detalles ...

Las notas en MSDN dicen que "hdrstop pragma le da control adicional sobre los nombres de los archivos de precompilación y sobre la ubicación en la que se guarda el estado de compilación". que es cierto, pero no es especialmente obvio exactamente qué tan útil puede ser ...

En pocas palabras.

  • Poniendo #pragma hdrstop en un archivo fuente que no está compilado con/Yc o/Yu no tiene ningún efecto.
  • Si tiene/Yu configurado para el archivo, hdrstop le dice al compilador que deseche todo antes de la línea en la que aparece hdrstop e inserte el encabezado precompilado.
  • Si/Yc se establece para el archivo, entonces hdrstop significa guardar todo el estado compilado para todo hasta la línea en la que aparece hdrstop como el encabezado precompilado.

El truco está en utilizar/Yc y/Yu sin el nombre de archivo de encabezado opcional; simplemente marque el botón de opción "usar" o "crear" y deje en blanco el cuadro de edición "a través del encabezado" (o edite el archivo del proyecto ...).

Así que tiene 1 archivo, posiblemente llamado PrecompiledHeader.cpp que incluye los encabezados que desea incluir en el encabezado precompilado y que tiene #pragma hdrstop al final de la lista de archivos incluidos. Este archivo ONE está compilado con/Yc.

Luego tiene todos sus otros archivos cpp con #pragma hdrstop después de incluir los archivos que están en su encabezado precompilado. Todos estos archivos están compilados con/Yu.

Esto da como resultado que PrecompiledHeader.cpp construya su (solo este) archivo pch único y todos los otros archivos que usen ese único archivo pch.

La ventaja de hacer esto es que NINGUNO de sus archivos debe incluir un archivo de encabezado de compilación precompilado "global", por lo que no es stdafx.h o lo que sea. Esto significa que puede configurar una configuración de compilación que construya SIN encabezados precompilados donde todas las líneas #pragma hdrstop simplemente se ignoran.

Esto es "bueno" porque significa que puede tener una única configuración de compilación "sin precompilación" que le permite desarrollar rápidamente (puede cambiar un solo encabezado y NO forzar al mundo a reconstruir) y otras configuraciones "normales" que SI usan encabezados precompilados.

+0

Gracias. ¡Muchas gracias! ... Ahora, hmm ... * "Luego tiene todos sus otros archivos cpp con #pragma hdrstop después de los archivos de inclusión que están en su encabezado precompilado." * - ¿Esto significa que los otros archivos necesitan saber qué hay en el encabezado precompilado para que puedan dividir sus incluye a antes y después de la línea hdrstop? –

+2

Funciona mejor si lo hace. Pero no es necesario. Obtendrá errores de compilación en sus construcciones precomp si tiene un archivo que está por encima del #pragma hdrstop que no está en su encabezado precompilado. A continuación, puede decidir si se usa lo suficiente como para garantizar que esté en el precomp o no. –

5

Todo el código anterior a #pragma hdrstop formará parte de un encabezado precompilado. Si no se da el parámetro de nombre de archivo, el nombre de la cabecera será el nombre base del archivo fuente con una extensión .PCH, como se menciona en the documentation:

El nombre del archivo de encabezado precompilado se determina de acuerdo con el reglas siguientes, en orden de precedencia:

  1. el argumento de la opción de compilador/Fp

  2. el argumento de nombre de archivo para #Pragma hdrstop

  3. El nombre base del archivo de origen con una extensión .PCH

Por lo tanto, si usted tiene que en un archivo llamado blah.cpp se producirá un archivo llamado blah.pch, IFF compilado con /Yc (que sólo un archivo debería haberse configurado).

+0

Ese es el tipo de cosa que sucede cuando omites las opciones 0, 1 y 2. Usar/Yu es bastante universal, opción 0. –

4

Si no utiliza #pragma hdrstop en su proyecto C/C++, debe tener un archivo .cpp dedicado como el archivo de origen para el archivo .pch creado.

Si utiliza #pragma hdrstop en un archivo .cpp con el que desea crear el archivo .pch, el archivo .cpp puede tener otros contenidos útiles después de la línea #pragma hdrstop. Cuando compila por primera vez este archivo .cpp con la opción de compilación/Yc, obtiene el archivo .pch y el archivo .obj. Cuando modifica el archivo .cpp y lo vuelve a compilar con la opción de compilación/Yu, el compilador reemplaza el contenido de la línea #pragma hdrstop con el archivo .pch y vuelve a compilar la parte después de la línea #pragma hdrstop, crea un nuevo archivo .obj y guarda la compilación hora. Es muy útil que su proyecto tenga el único archivo fuente.

Para los archivos fuente solo utilizando archivos de cabeza precompilar, el #pragma hdrstop es un hito para el compilador qué parte debe reemplazarse por el archivo .pch, por lo que no necesita indicar el nombre del archivo de encabezado con la opción/Yu compilation.

+0

Gracias. Esta respuesta está haciendo * algún * sentido. Entonces, ¿tiene que compilar el * mismo * archivo cpp con diferentes compiladores para que esto tenga sentido? –

+0

Sí. Un proyecto C/C++ puede usar más de un archivo .pch. Puede especificar el archivo .pch para cada archivo de origen mediante la opción de compilación/Yu o la #pragma hdrstop. – ligand

+0

Eso entendí mucho. Lo que quise preguntar es: para que esto tenga sentido, ¿tenemos un 'U.cpp' que siempre se compila con'/Yu' y otro 'C.cpp' que siempre se compila con'/Yc'? * O * ¿tenemos un solo 'UC.cpp' que se compila una vez con'/Yc' y luego con '/ Yu' ?? –

Cuestiones relacionadas