2009-03-24 26 views
30

Veo tanto código que incluye stdafx.h. Diga, lo hago no quiero encabezados precompilados. E I será incluir todos los encabezados del sistema necesarios a mí mismo de forma manual. En ese caso, ¿hay alguna otra buena razón por la que deba saber dónde necesito stdafx.h?stdafx.h: ¿Cuándo lo necesito?

+0

(para cualquiera que use esto como referencia) Si ya está usando encabezados precompilados, vaya a las propiedades de su proyecto, C/C++ y encabezados precompilados, y elija la opción de no usarlos. – MirroredFate

+0

StdAfx.h para principiantes: http://www.cplusplus.com/articles/2z86b7Xj/ –

Respuesta

16

Si no desea utilizar encabezados precompilados, no tiene sentido utilizar un archivo de inclusión estándar; esto ralentizará la compilación para cada archivo que lo incluya y hará que incluyan elementos adicionales que no necesitar. Deshágase de él y solo incluya los encabezados que necesitan.

2

Incluso sin encabezados precompilados, stdafx.h podría ser útil ya que agrupa los encabezados incluidos y las definiciones comunes para todos los archivos.

Por supuesto, puede optar por repetir todas estas definiciones en cada archivo. stdafx.h no es estrictamente necesario.

+0

Mala práctica: siempre debe enumerar explícitamente los encabezados que necesita para que pueda verificar las dependencias de los módulos. – snemarch

+0

stdafx generalmente incluye definiciones específicas de plataforma comunes para todos los archivos. Es una "dependencia" de cada archivo. Lo usas para no repetir las definiciones en cada archivo. Esta es una buena práctica, porque solo haces eso en un solo lugar. – kgiannakakis

+0

No es una dependencia de cada archivo a menos que cada archivo realmente requiera cada encabezado en stdafx. En la práctica, esto rara vez es el caso (IME). Usarlo de esta manera es perezoso en el mejor de los casos, mala práctica en el peor. – Patrick

2

stdafx.h es simplemente otro archivo de encabezado. Si se cayó, no necesita que lo sienta libre de incluirlo y eliminarlo del proyecto.

Sin embargo, es bastante típico tener un archivo como stdafx.h exactamente para que funcionen los encabezados precompilados y no incluir todo el material manualmente en cada archivo fuente.

1

Como han mencionado otros: si no necesita encabezados precompilados, realmente no necesita stdafx.h. Y usarlo solo para agrupar los campos comunes es una práctica bastante mala, en realidad.

De hecho, incluso cuando usa encabezados precompilados, es una buena práctica incluir los encabezados que su proceso realmente necesita después de stdafx.h (o precompilado.h o como quiera llamarlo), junto con la magia #ifdef en su precompilado encabezado para desactivar el uso de PCH.

¿Por qué? Para verificar las dependencias de su módulo. Ser capaz de deshabilitar su PCH le permite ver si está incluyendo módulos necesarios o no, y luego puede escribir una herramienta para verificar las interdependencias de su módulo al analizar sus archivos .cpp y .h (excluyendo el encabezado PCH, por supuesto).

+1

Sí, escribir un analizador de C++ es una gran ganancia de tiempo ......... – Virus721

2

Puede usar encabezados pre compilados (lo cual es bueno) sin usar stdafx.h (lo abomino también). Solo tengo acceso a VC++ 6.0 pero en eso vaya a Configuración del proyecto | C/C++ | Encabezados precompilados y seleccione "uso automático del encabezado precompilado", pero deje el cuadro "compilado a través" vacío.

0

Sé que este es un tema viejo, pero pensé que iba a pasar mi opinión a los lectores. Encontré esto en 2017, así que estoy seguro de que no soy el único que estará aquí.

Existe la ventaja de utilizar encabezados precompilados, que otros pueden pasar por alto porque han estado utilizando su práctica durante muchos años. El estándar de C++ ha evolucionado mucho. En lugar de incluir vector en 20 archivos que pueda necesitar y/o lo que sea, utiliza un archivo PCH y el compilador tiene que trabajar menos, y eso hace que todos se muestren felices. También puede colocar sus macros comunes allí, como VERIFICAR, y ASSERT y objetos de clase inteligente. No coloque sus encabezados de clase allí, no tendría sentido para eso, más bien la biblioteca estándar o algo que necesitará usar globalmente en muchos lugares, como las macros que mencioné.

Básicamente se da cuenta de esto, al incluir los encabezados que necesita en cada archivo que necesita, como iostream, cadena y vector, está compilando efectivamente cada vez como una línea en el archivo. Incluye un encabezado "Pre compilado", así que solo el nombre debe sonar allí.

Cuestiones relacionadas