¿Para qué se usa "stdafx.h" en Visual Studio?

500

Un archivo con nombre stdafx.hse genera automáticamente cuando inicio un proyecto en Visual Studio 2010. Necesito hacer una biblioteca C ++ multiplataforma, así que no puedo / no puedo usar este archivo de encabezado.

¿Para qué se stdafx.husa? ¿Está bien que elimine este archivo de encabezado?

prosseek
fuente
2
Si recibo un error de compilación relacionado con stdafx.h, generalmente configuro la configuración para no crear o usar este archivo ..
phoad
66
Artículo: StdAfx.h para principiantes - viva64.com/en/b/0265
Puede usar el archivo de encabezado muy bien en otras plataformas, para ellos es solo un archivo de encabezado normal. Simplemente no ofrece ningún beneficio de rendimiento allí.
Andrea

Respuestas:

826

Todos los compiladores de C ++ tienen un serio problema de rendimiento con el que lidiar. Compilar código C ++ es un proceso largo y lento.

La compilación de encabezados incluidos en la parte superior de los archivos C ++ es un proceso muy largo y lento. Compilar las enormes estructuras de encabezado que forman parte de la API de Windows y otras bibliotecas API grandes es un proceso muy , muy largo y lento. Tener que hacerlo una y otra vez para cada archivo fuente de Cpp es una sentencia de muerte.

Esto no es exclusivo de Windows, sino un viejo problema que enfrentan todos los compiladores que tienen que compilar contra una API grande como Windows.

El compilador de Microsoft puede mejorar este problema con un simple truco llamado encabezados precompilados . El truco es bastante ingenioso: aunque cada archivo CPP puede dar un significado diferente y legal a la cadena de archivos de encabezado incluidos en la parte superior de cada archivo Cpp (por cosas como tener diferentes macros # definidas antes de las inclusiones, o al incluir los encabezados en un orden diferente), ese no suele ser el caso. La mayoría de las veces, tenemos docenas o cientos de archivos incluidos, pero todos tienen el mismo significado para todos los archivos Cpp que se compilan en su aplicación.

El compilador puede ahorrar mucho tiempo si no tiene que comenzar a compilar todos los archivos Cpp más sus docenas de inclusiones, literalmente, desde cero cada vez.

El truco consiste en designar un archivo de encabezado especial como punto de partida de todas las cadenas de compilación, el llamado archivo de 'encabezado precompilado', que comúnmente es un archivo llamado stdafx.h simplemente por razones históricas.

Simplemente enumere todos sus grandes encabezados enormes para sus API en su archivo stdafx.h, en el orden apropiado, y luego inicie cada uno de sus archivos CPP en la parte superior con un #include "stdafx.h", antes de cualquier contenido significativo (casi lo único permitido antes es comentarios)

En esas condiciones, en lugar de comenzar desde cero , el compilador comienza a compilar a partir de los resultados ya guardados de compilar todo en stdafx.h.

No creo que este truco sea exclusivo de los compiladores de Microsoft, ni creo que haya sido un desarrollo original.

Para compiladores de Microsoft, el ajuste que controla el uso de encabezados precompilados es controlado por un argumento de línea de comandos para el compilador: /Yu "stdafx.h". Como puede imaginar, el uso del stdafx.hnombre del archivo es simplemente una convención; puede cambiar el nombre si así lo desea.

En Visual Studio 2010, esta configuración se controla desde la GUI haciendo clic derecho en un proyecto CPP, seleccionando 'Propiedades' y navegando a "Propiedades de configuración \ C / C ++ \ Encabezados precompilados". Para otras versiones de Visual Studio, la ubicación en la GUI será diferente.

Tenga en cuenta que si deshabilita los encabezados precompilados (o ejecuta su proyecto a través de una herramienta que no los admite), no hace que su programa sea ilegal; simplemente significa que su herramienta compilará todo desde cero todo el tiempo.

Si está creando una biblioteca sin dependencias de Windows, puede comentar o eliminar fácilmente #includes del stdafx.harchivo. No es necesario eliminar el archivo per se, pero claramente también puede hacerlo, deshabilitando la configuración del encabezado de precompilación anterior.

Euro Micelli
fuente
66
Incluso si usó solo para archivos del espacio de nombres estándar, obtiene un beneficio de velocidad
Ghita
11
Dios mío, muy buena respuesta de hecho. Estaba buscando un compilador c estándar compatible. Resulta que puedo deshabilitar las extensiones micro $ oft de las propiedades del proyecto, cambiar el compilador de "auto" a "c" y prácticamente tienes un compilador e IDE "estándar".
EKanadily
44
@Rishi: ¿por 'línea', quieres decir #include "stdafx.h"? Claro, pero eso es solo un #include estándar. La parte de "extensión MS" es solo una optimización del rendimiento del compilador; no cambia la semántica de tener un archivo de encabezado que se llama "stdafx.h". Tenga en cuenta que si elimina la inclusión y su código depende de cualquier cosa que se haya incluido a través de stdafx.h, tendrá que incluirlo directamente.
Euro Micelli
44
@ Youda008, no del todo cierto. Antes de compilar un archivo de código, los contenidos de los encabezados se "pegan" de manera simple y literal en el lugar donde los #includecoloca en el archivo fuente (realizado por el mismo paso de "preprocesador" que evalúa las macros). El archivo total resultante se pasa al compilador real, que nunca ve un archivo de encabezado como una entidad separada. Solo coloca declaraciones en el archivo de encabezado porque eso es lo que funciona bien en un archivo de encabezado: es una regla convencional. ¡Intentalo! Cree un archivo de encabezado con un programa completo, luego cree un archivo fuente que solo tenga un #include. Se compila bien.
Euro Micelli
28
Curiosidad histórica. El nombre de stdafx.h data de alrededor de 1992, cuando MFC se llamaba 'Extensiones de marco de aplicación' antes de su lanzamiento. Visual Studio 2015 todavía tiene el nombre predeterminado ..
kert
48

Es un "archivo de encabezado precompilado": cualquier encabezado que incluya en stdafx.h se procesará previamente para ahorrar tiempo durante las compilaciones posteriores. Puede leer más sobre esto aquí en MSDN .

Si está creando una aplicación multiplataforma, marque "Proyecto vacío" al crear su proyecto y Visual Studio no colocará ningún archivo en su proyecto.

casablanca
fuente
15
No hay nada en este archivo que no funcione en otras plataformas. Podría ralentizar la compilación allí, si el compilador no admite encabezados precompilados, pero no debería romperlo. Es solo un archivo de encabezado que incluye otros archivos de encabezado.
destituido el
2
@detunized: Tal vez mi respuesta lo hizo sonar de otra manera, así que gracias por aclarar esa parte.
casablanca
3

"Stdafx.h" es un encabezado precompilado. Incluye archivos para archivos de inclusión del sistema estándar y para archivos de inclusión específicos del proyecto que se usan con frecuencia pero se cambian con poca frecuencia, lo que reduce el tiempo de compilación y el procesamiento innecesario.

Encabezado precompilado stdafx.h se usa básicamente en Microsoft Visual Studio para que el compilador conozca los archivos que alguna vez se compilaron y no es necesario compilarlos desde cero. Puedes leer más al respecto

http://www.cplusplus.com/articles/1TUq5Di1/

https://docs.microsoft.com/en-us/cpp/ide/precompiled-header-files?view=vs-2017

Akash das
fuente
-10

Me encontré con esto yo mismo, ya que estoy tratando de crearme un framework básico, pero comencé creando una nueva opción del Programa Win32 en Visual Studio 2017. "stdafx.h" es innecesario y debería eliminarse. Luego puede eliminar los estúpidos "stdafx.h" y "stdafx.cpp" que se encuentran en su Explorador de soluciones, así como los archivos de su proyecto. En su lugar, deberás poner

#include <Windows.h>

en lugar.

Adam H.
fuente