O que é um arquivo .h.gch?

116

Recentemente, tive um projeto de classe onde tive que fazer um programa com G ++.

Eu usei um makefile e por algum motivo ele ocasionalmente deixava um arquivo .h.gch para trás.

Às vezes, isso não afetava a compilação, mas de vez em quando resultava no compilador emitindo um erro para um problema que foi corrigido ou que não fazia sentido.

Eu tenho duas perguntas:

1) O que é um arquivo .h.gch e para que ele é usado? e

2) Por que causaria tantos problemas se não foi limpo?

Mnuzzo
fonte
13
O gcc os cria se você acidentalmente diz para compilar um arquivo .h. Não faça isso :) (a menos que você realmente queira criar um cabeçalho pré-compilado)
jalf
3
Fora do mundo GCC , os arquivos .gch são chamados de .pch .
Patapoom

Respostas:

115

Um .gcharquivo é um cabeçalho pré-compilado.

Se a .gchnão for encontrado, os arquivos de cabeçalho normais serão usados.

No entanto, se o seu projeto estiver configurado para gerar cabeçalhos pré-compilados, ele os fará se não existirem e os usará na próxima compilação.

Às vezes, o *.h.gcharquivo fica corrompido ou contém informações desatualizadas, portanto, excluir o arquivo e compilá-lo novamente deve corrigir o problema.

Dunewalker
fonte
1
Então, por que o tamanho do .gch geralmente é tão grande?
NAND
38

Se você quiser saber sobre um arquivo, basta digitar no terminal

file filename

file a.h.gch dá:

GCC precompiled header (version 013) for C
riteshkasat
fonte
2
O meu (OSX, zsh) diz apenas "dados" para o .h.gcharquivo. Suspeito que você precisa de arquivos de banco de dados adequados para isso.
Ondrej Slinták
17

a) Eles são cabeçalhos pré-compilados: http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

b) Eles contêm informações "em cache" de arquivos .h e devem ser atualizados sempre que você alterar o respectivo arquivo .h. Se isso não acontecer - você tem dependências erradas definidas em seu projeto

Oleksandr Tymoshenko
fonte
15

Outras respostas são completamente precisas em relação ao que é um arquivo gch. No entanto, o contexto (neste caso, um iniciante usando g ++) é tudo. Nesse contexto, existem duas regras:

  1. Nunca, jamais, coloque um arquivo .h em uma linha de compilação g ++. Apenas arquivos .cpp. Se um arquivo .h for compilado acidentalmente, remova quaisquer arquivos * .gch

  2. Nunca, jamais, coloque um arquivo .cpp em uma instrução #include.

Se a regra um for quebrada, em algum momento o problema descrito na pergunta ocorrerá. Se a regra dois for quebrada, em algum ponto o vinculador reclamará sobre símbolos definidos de forma múltipla.

tgibson
fonte
2
Para o primeiro ponto, usarei uma função como exemplo. Antes que um programador possa chamar myfunc (), o programador deve descrever myfunc () para o compilador usando um protótipo de função. Se vários arquivos .cpp diferentes chamam myfunc (), o protótipo deve ser fornecido em cada .cpp. É propenso a erros digitar o protótipo em cada arquivo .cpp. Portanto, o protótipo da função é colocado em um arquivo .h que é #incluído em cada arquivo .cpp onde myfunc é chamado. Os arquivos de cabeçalho contêm apenas informações para o compilador, não o código que é executado. Portanto, não faz sentido colocar um arquivo .h em uma linha g ++.
tgibson de
Em sua regra 2, nós #incluímos arquivos .cpp se eles tiverem uma definição de função de modelo
NAND