Che cos'è un file .h.gch?


116

Recentemente ho avuto un progetto di classe in cui ho dovuto creare un programma con G ++.

Ho usato un makefile e per qualche motivo a volte lasciava un file .h.gch.

A volte, questo non ha influenzato la compilazione, ma ogni tanto il compilatore emetteva un errore per un problema che era stato risolto o che non aveva senso.

Ho due domande:

1) Cos'è un file .h.gch ea cosa serve? e

2) Perché causerebbe tali problemi quando non è stato ripulito?


13
gcc li crea se gli dici accidentalmente di compilare un file .h. Non farlo :) (a meno che tu non voglia effettivamente creare un'intestazione precompilata)
jalf

3
Al di fuori del mondo GCC , i file .gch sono chiamati .pch .
Patapoom

Risposte:


115

Un .gchfile è un'intestazione precompilata.

Se .gchnon viene trovato, verranno utilizzati i normali file di intestazione.

Tuttavia, se il tuo progetto è impostato per generare intestazioni precompilate, le creerà se non esistono e le utilizzerà nella build successiva.

A volte *.h.gchverrà danneggiato o conterrà informazioni obsolete, quindi eliminare quel file e compilarlo di nuovo dovrebbe risolverlo.


1
Allora perché la dimensione di .gch è solitamente così grande?
NAND

38

Se vuoi sapere di un file, digita semplicemente sul terminale

file filename

file a.h.gch dà:

GCC precompiled header (version 013) for C

2
Il mio (OSX, zsh) dice solo "dati" per il .h.gchfile. Sospetto che tu abbia bisogno di file di database adeguati per questo.
Ondrej Slinták



15

Altre risposte sono completamente accurate riguardo a cosa sia un file gch. Tuttavia, il contesto (in questo caso, un principiante che usa g ++) è tutto. In questo contesto, ci sono due regole:

  1. Mai, mai, mai mettere un file .h su una riga di compilazione g ++. Solo file .cpp. Se un file .h viene compilato accidentalmente, rimuovere tutti i file * .gch

  2. Mai, mai, mai mettere un file .cpp in un'istruzione #include.

Se la regola uno viene infranta, a un certo punto si verificherà il problema descritto nella domanda. Se la regola due viene infranta, a un certo punto il linker si lamenterà dei simboli definiti in modo multiplo.


2
Per il primo punto userò una funzione come esempio. Prima che un programmatore possa chiamare myfunc (), il programmatore deve descrivere myfunc () al compilatore utilizzando un prototipo di funzione. Se diversi file .cpp chiamano myfunc (), il prototipo deve essere fornito in ogni .cpp. È soggetto a errori digitare il prototipo in ogni file .cpp. Pertanto, il prototipo della funzione viene inserito in un file .h che è #incluso in ogni file .cpp in cui viene chiamata myfunc. I file di intestazione contengono solo le informazioni per il compilatore, non il codice eseguito. Quindi non ha senso mettere un file .h su una riga g ++.
tgibson

Nella regola 2, #includiamo i file .cpp se hanno la definizione della funzione modello
NAND
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.