Qu'est-ce qu'un fichier .h.gch?


116

J'ai récemment eu un projet de classe où je devais créer un programme avec G ++.

J'ai utilisé un makefile et pour une raison quelconque, il a parfois laissé un fichier .h.gch derrière.

Parfois, cela n'affectait pas la compilation, mais de temps en temps, le compilateur produisait une erreur pour un problème qui avait été corrigé ou qui n'avait pas de sens.

J'ai deux questions:

1) Qu'est-ce qu'un fichier .h.gch et à quoi sert-il? et

2) Pourquoi causerait-il de tels problèmes quand il n'était pas nettoyé?


13
gcc les crée si vous lui dites accidentellement de compiler un fichier .h. Ne faites pas ça :) (sauf si vous voulez réellement créer un en-tête précompilé)
jalf

3
En dehors du monde GCC , les fichiers .gch sont appelés .pch .
Patapoom

Réponses:


115

Un .gchfichier est un en-tête précompilé.

Si un .gchn'est pas trouvé, les fichiers d'en-tête normaux seront utilisés.

Cependant, si votre projet est configuré pour générer des en-têtes pré-compilés, il les créera s'ils n'existent pas et les utilisera dans la prochaine génération.

Parfois, le *.h.gchfichier sera corrompu ou contiendra des informations obsolètes, donc la suppression de ce fichier et sa recompilation devraient le corriger.


1
Alors, pourquoi la taille du .gch est-elle généralement si grande?
NAND

38

Si vous voulez connaître un fichier, tapez simplement sur le terminal

file filename

file a.h.gch donne:

GCC precompiled header (version 013) for C

2
Le mien (OSX, zsh) dit simplement "données" pour .h.gchfichier. Je soupçonne que vous avez besoin de fichiers de base de données appropriés pour cela.
Ondrej Slinták



15

D'autres réponses sont tout à fait exactes en ce qui concerne ce qu'est un fichier gch. Cependant, le contexte (dans ce cas, un débutant utilisant g ++) est tout. Dans ce contexte, il existe deux règles:

  1. Jamais, jamais, jamais mettre un fichier .h sur une ligne de compilation g ++. Seuls les fichiers .cpp. Si un fichier .h est compilé accidentellement, supprimez tous les fichiers * .gch

  2. Jamais, jamais, jamais mettre un fichier .cpp dans une instruction #include.

Si la règle 1 est enfreinte, le problème décrit dans la question se produira à un moment donné. Si la règle deux est enfreinte, à un moment donné, l'éditeur de liens se plaindra de symboles à définition multiple.


2
Pour le 1er point, j'utiliserai une fonction comme exemple. Avant qu'un programmeur puisse appeler myfunc (), le programmeur doit décrire myfunc () au compilateur en utilisant un prototype de fonction. Si plusieurs fichiers .cpp différents appellent myfunc (), alors le prototype doit être fourni dans chaque .cpp. Il est sujet aux erreurs de taper le prototype dans chaque fichier .cpp. Par conséquent, le prototype de fonction est placé dans un fichier .h qui est #inclus dans chaque fichier .cpp où myfunc est appelé. Les fichiers d'en-tête contiennent uniquement des informations pour le compilateur, pas le code qui est exécuté. Il est donc inutile de mettre un fichier .h sur une ligne g ++.
tgibson

Dans votre règle 2, nous #incluons les fichiers .cpp s'ils ont une définition de la fonction de modèle
NAND
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.