¿Qué es un archivo .h.gch?

116

Recientemente tuve un proyecto de clase donde tuve que hacer un programa con G ++.

Usé un archivo MAKE y, por alguna razón, ocasionalmente dejaba un archivo .h.gch.

A veces, esto no afectó a la compilación, pero de vez en cuando daría lugar a que el compilador emitiera un error por un problema que se había solucionado o que no tenía sentido.

Tengo dos preguntas:

1) ¿Qué es un archivo .h.gch y para qué se utiliza? y

2) ¿Por qué causaría tales problemas cuando no se limpió?

mnuzzo
fuente
13
gcc los crea si accidentalmente le dice que compile un archivo .h. No hagas eso :) (a menos que realmente quieras crear un encabezado precompilado)
jalf
3
Fuera del mundo de GCC , los archivos .gch se denominan .pch .
Patapoom

Respuestas:

115

Un .gcharchivo es un encabezado precompilado.

Si .gchno se encuentra, se utilizarán los archivos de encabezado normales.

Sin embargo, si su proyecto está configurado para generar encabezados precompilados, los hará si no existen y los usará en la próxima compilación.

A veces, el *.h.gcharchivo se corrompe o contiene información desactualizada, por lo que eliminar ese archivo y volver a compilarlo debería solucionarlo.

Dunewalker
fuente
1
Entonces, ¿por qué el tamaño de .gch suele ser tan grande?
NAND
38

Si desea conocer un archivo, simplemente escriba en la terminal

file filename

file a.h.gch da:

GCC precompiled header (version 013) for C
riteshkasat
fuente
2
El mío (OSX, zsh) solo dice "datos" para el .h.gcharchivo. Sospecho que necesita archivos de base de datos adecuados para esto.
Ondrej Slinták
17

a) Son encabezados precompilados: http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

b) Contienen información "almacenada en caché" de archivos .h y deben actualizarse cada vez que cambie el archivo .h respectivo. Si no sucede, tiene dependencias incorrectas establecidas en su proyecto

Oleksandr Tymoshenko
fuente
15

Otras respuestas son completamente precisas con respecto a lo que es un archivo gch. Sin embargo, el contexto (en este caso, un principiante que usa g ++) lo es todo. En este contexto, hay dos reglas:

  1. Nunca, nunca, coloque un archivo .h en una línea de compilación g ++. Solo archivos .cpp. Si un archivo .h se compila accidentalmente, elimine los archivos * .gch

  2. Nunca, nunca, ponga un archivo .cpp en una instrucción #include.

Si se rompe la regla uno, en algún momento ocurrirá el problema descrito en la pregunta. Si se rompe la regla dos, en algún momento el enlazador se quejará de símbolos definidos de forma múltiple.

tgibson
fuente
2
Para el primer punto usaré una función como ejemplo. Antes de que un programador pueda llamar a myfunc (), el programador debe describir myfunc () al compilador usando un prototipo de función. Si varios archivos .cpp diferentes llaman a myfunc (), entonces se debe proporcionar el prototipo en cada .cpp. Es propenso a errores escribir el prototipo en cada archivo .cpp. Por lo tanto, el prototipo de la función se coloca en un archivo .h que se #incluye en cada archivo .cpp donde se llama a myfunc. Los archivos de encabezado solo contienen información para el compilador, no código que se ejecuta. Por lo tanto, no tiene sentido poner un archivo .h en una línea g ++.
tgibson
En su regla 2, #incluimos archivos .cpp si tienen una definición de función de plantilla
NAND