Encabezados precompilados ( eng. encabezados precompilados ) - en entornos de programación en C y C ++ - una forma de acelerar la compilación de programas preprocesando los llamados archivos de encabezado que contienen interfaces de módulos y, de acuerdo con las normas de estos Los lenguajes de programación se conectan al programa insertando directamente sus textos en el cuerpo del programa principal mediante una directiva de preprocesador #include especial . Los encabezados precompilados se guardan en el disco como archivos en el formato interno del compilador, y cuando se vuelve a compilar el proyecto, el tiempo para procesarlos y conectarlos se reduce significativamente.
El lenguaje de programación C usaba archivos de encabezado para conectar un módulo externo . Esto simplifica el compilador y brinda cierta flexibilidad, y funcionó durante 20 años, siempre que los encabezados fueran pequeños y los archivos en el proyecto fueran pocos. Con la ampliación de los proyectos de software, el tiempo de compilación comenzó a crecer cuadráticamente [1] : aumenta tanto el número de unidades de compilación como el número de encabezados conectados a cada unidad específica. En proyectos especialmente grandes, una compilación completa lleva decenas de minutos y se realiza más a menudo durante una compilación nocturna que en los lugares de trabajo de los programadores.
Además, el lenguaje de programación C pertenece a la familia LR(1) , y por lo tanto los compiladores de C son más lentos, por ejemplo, Pascal (que es LL(1) ) .
Para reducir el tiempo de compilación, se desarrollaron encabezados precompilados. Dado que los archivos de encabezado cambian con mucha menos frecuencia que los archivos que contienen el código del programa (y los archivos de biblioteca casi nunca), resultó ser una herramienta de optimización razonable para preprocesar los encabezados y convertirlos en archivos de tipo especial que se pueden incluir al compilar un programa, sin pasar por las primeras etapas de compilación. Debido a la compilación previa de los encabezados, el compilador solo procesa por completo las partes modificadas del programa. Sin embargo, la compilación previa del encabezado no siempre ayuda:
Por lo tanto, como regla general, todo tipo de encabezados de biblioteca, grandes y al mismo tiempo que cambian raramente, se incluyen en el conjunto precompilado.
Todo lo que viene antes de la directiva está precompilado #pragma hdrstop.
// principal.cpp ///// Cabeceras precompiladas // C++ # incluye <cstdio> // STL # incluye <cadena> # incluir <vector> # incluir <mapa> # incluir <algoritmo> // Específico del sistema operativo # incluye <windows.h> ///// La precompilación termina aquí # pragma hdrstop ///// Otros encabezados # incluyen "unit1.h" int principal () { hacerUnidad1 (); devolver 0 ; }Al compilar harchivos, GCC asume automáticamente que se requiere un encabezado precompilado (o se puede especificar a través de la línea de comando, interruptor -x). La mayoría de los shells de programación (como Code::Blocks ) le permiten especificar qué archivos precompilar. La solución estándar es "volcar" los encabezados más utilizados, pero que rara vez cambian, en un harchivo e incluirlo primero.
// pch.h - precompilarlo (establecido en el archivo MAKE o en el proyecto). // C++ # incluye <cstdio> # incluir <cmath> // STL # incluye <cadena> # incluir <vector> # incluir <mapa> # incluir <algoritmo> // Específico del sistema operativo # incluye <windows.h> // unit1.cpp // ¡primero precompilado! # incluir "pch.h" // otros encabezados # incluyen "unit1.h" vacío doUnit1 () { } // main.cpp // ¡primero precompilado! # incluir "pch.h" // otros encabezados # incluyen "unit1.h" int principal () { hacerUnidad1 (); devolver 0 ; }La situación es similar a GCC. Visual C++ versión 6.0 y superior precompila el encabezado con el nombre estándar stdafx.h(este nombre se puede cambiar con una opción de compilador).
El Asistente para nuevos proyectos del IDE le permite elegir si desea utilizar encabezados precompilados. Su uso agregará automáticamente la opción de compilador /Yu'stdafx.h', y la compilación de cualquier archivo que no contenga fallará con un error. #include "stdafx.h"