2009-08-06 31 views
83

Recientemente tuve un proyecto de clase donde tuve que hacer un programa con G ++. Usé un archivo MAKE y, por alguna razón, de vez en cuando dejaba un archivo .h.gch atrás. A veces, esto no afectaba a la compilación, pero de vez en cuando daba como resultado que el compilador emitiera un error para un problema que se había solucionado o que no tenía sentido. Tengo dos preguntas:¿Qué es un archivo .h.gch?

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

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

Gracias por la ayuda.

+8

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

+0

Fuera del mundo ** GCC **, los archivos **. Gch ** se llaman **. Pch **. – Patapoom

Respuesta

85

Un archivo .gch es un encabezado precompilado.

Si no se encuentra .gch, se usará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 siguiente compilación.

A veces, el *.h.gch se corrompe o contiene información obsoleta, por lo que eliminarlo y volver a compilarlo debería solucionarlo.

14

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

b) Cada una contiene "caché" de la información de los archivos .h y debe ser actualizada cada vez que cambie archivo .h respectivo. Si no ocurre, tiene dependencias incorrectas configuradas en su proyecto

26

Si usted quiere saber acerca de un archivo, simplemente escriba en el terminal

file filename 

file a.h.gch da:

GCC precompiled header (version 013) for C 
4

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

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

  2. Nunca, nunca, ponga un archivo .cpp en una sentencia #include.

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

+0

¿Podría detallar más sobre el primer punto? – Darktega

+1

Para el 1er punto usaré una función como ejemplo. Antes de que un programador pueda llamar a myfunc(), el programador debe describir myfunc() al compilador utilizando un prototipo de función. Si varios archivos .cpp diferentes llaman a myfunc(), entonces el prototipo se debe proporcionar en cada .cpp. Es propenso a errores escribir el prototipo en cada archivo .cpp. Por lo tanto, el prototipo de función se coloca en un archivo .h que es #incluido en cada archivo .cpp al que se llama myfunc. Los archivos de encabezado solo contienen información para el compilador, no código que se ejecuta. Por lo tanto, no tiene sentido colocar un archivo .h en una línea de g ++. – tgibson