Co to jest plik .h.gch?

116

Niedawno miałem projekt klasowy, w którym musiałem stworzyć program z G ++.

Użyłem pliku makefile iz jakiegoś powodu czasami pozostawiał on plik .h.gch.

Czasami nie miało to wpływu na kompilację, ale co jakiś czas powodowało to, że kompilator wyświetlał błąd dotyczący problemu, który został naprawiony lub który nie miał sensu.

Mam dwa pytania:

1) Co to jest plik .h.gch i do czego służy? i

2) Dlaczego miałoby to powodować takie problemy, gdy nie zostało oczyszczone?

mnuzzo
źródło
13
gcc tworzy je, jeśli przypadkowo powiesz mu, aby skompilował plik .h. Nie rób tego :) (chyba że faktycznie chcesz utworzyć prekompilowany nagłówek)
jalf
3
Poza światem GCC pliki .gch noszą nazwę .pch .
Patapoom

Odpowiedzi:

115

.gchPlik jest skompilowany nagłówka.

Jeśli a .gchnie zostanie znalezione, zostaną użyte normalne pliki nagłówkowe.

Jeśli jednak projekt jest ustawiony na generowanie wstępnie skompilowanych nagłówków, utworzy je, jeśli nie istnieją, i użyje ich w następnej kompilacji.

Czasami *.h.gchplik zostanie uszkodzony lub zawiera nieaktualne informacje, więc usunięcie tego pliku i ponowne skompilowanie powinno to naprawić.

Dunewalker
źródło
1
Dlaczego więc rozmiar .gch jest zwykle tak duży?
NAND
38

Jeśli chcesz wiedzieć o pliku, po prostu wpisz na terminalu

file filename

file a.h.gch daje:

GCC precompiled header (version 013) for C
riteshkasat
źródło
2
Mój (OSX, zsh) po prostu mówi „dane” dla .h.gchpliku. Podejrzewam, że potrzebujesz do tego odpowiednich plików bazy danych.
Ondrej Slinták
17

a) Są to wstępnie skompilowane nagłówki: http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

b) Zawierają informacje „z pamięci podręcznej” z plików .h i powinny być aktualizowane za każdym razem, gdy zmieniasz odpowiedni plik .h. Jeśli tak się nie stanie - w swoim projekcie masz ustawione niewłaściwe zależności

Oleksandr Tymoszenko
źródło
15

Inne odpowiedzi są całkowicie dokładne w odniesieniu do tego, czym jest plik GCH. Jednak kontekst (w tym przypadku początkujący używający g ++) jest wszystkim. W tym kontekście obowiązują dwie zasady:

  1. Nigdy, przenigdy nie umieszczaj pliku .h w linii kompilacji g ++. Tylko pliki .cpp. Jeśli plik .h zostanie kiedykolwiek skompilowany przypadkowo, usuń wszystkie pliki * .gch

  2. Nigdy, przenigdy nie umieszczaj pliku .cpp w instrukcji #include.

Jeśli zasada pierwsza zostanie złamana, w pewnym momencie pojawi się problem opisany w pytaniu. Jeśli reguła druga zostanie złamana, w pewnym momencie linker będzie narzekał na symbole wielokrotnie definiowane.

tgibson
źródło
2
W pierwszym punkcie użyję funkcji jako przykładu. Zanim programista będzie mógł wywołać myfunc (), musi opisać myfunc () kompilatorowi przy użyciu prototypu funkcji. Jeśli kilka różnych plików .cpp wywołuje funkcję myfunc (), to prototyp musi znajdować się w każdym pliku .cpp. Wypisywanie prototypu w każdym pliku .cpp jest podatne na błędy. Dlatego prototyp funkcji jest umieszczony w pliku .h, który jest # zawarty w każdym pliku .cpp, w którym wywoływana jest funkcja myfunc. Pliki nagłówkowe zawierają tylko informacje dla kompilatora, a nie kod, który jest wykonywany. Więc nie ma sensu umieszczanie pliku .h w linii g ++.
tgibson
W Twojej regule 2 # uwzględniamy pliki .cpp, jeśli mają definicję funkcji szablonu
NAND