2009-08-06 17 views
83

Niedawno miałem projekt klasy, w którym musiałem stworzyć program z G ++. Użyłem pliku makefile iz jakiegoś powodu od czasu do czasu zostawiłem plik .h.gch. Niekiedy nie miało to wpływu na kompilację, ale co jakiś czas powodowałoby to, że kompilator zgłaszał błąd dotyczący problemu, który został naprawiony lub nie miał sensu. Mam dwa pytania:Co to jest plik .h.gch?

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

2) Dlaczego spowodowałoby to takie problemy, gdyby nie zostało wyczyszczone?

Dzięki za pomoc.

+8

gcc tworzy je, jeśli przez przypadek powiesz mu, aby skompilować plik .h. Nie rób tego :) (chyba że chcesz utworzyć prekompilowany nagłówek) – jalf

+0

Poza światem ** GCC **, ** .gch ** pliki są nazywane **. Pch **. – Patapoom

Odpowiedz

85

Plik .gch jest prekompilowanym nagłówkiem.

Jeśli nie zostanie znaleziony .gch, zostaną użyte normalne pliki nagłówkowe.

Jeśli jednak twój projekt jest skonfigurowany do generowania wstępnie skompilowanych nagłówków, zrobi je, jeśli nie istnieją i użyje ich w następnej kompilacji.

Czasami *.h.gch zostanie uszkodzony lub zawiera nieaktualne informacje, dlatego usunięcie tego pliku i skompilowanie go ponownie powinno go naprawić.

26

Jeśli chcesz wiedzieć na temat pliku, wystarczy wpisać na terminalu

file filename 

file a.h.gch daje:

GCC precompiled header (version 013) for C 
4

Inne odpowiedzi są całkowicie prawdziwe w odniesieniu do tego, co jest plikiem GCH. Jednak kontekst (w tym przypadku początkujący używający g ++) jest wszystkim. W tym kontekście istnieją dwie reguły:

  1. Nigdy, przenigdy, nie umieszczaj pliku .h na 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 jest zepsuta, w pewnym momencie wystąpi problem opisany w pytaniu. Jeśli zasada 2 zostanie złamana, w pewnym momencie linker będzie narzekał na wielokrotnie mnożone symbole.

+0

Czy możesz podać więcej szczegółów na temat pierwszego punktu? – Darktega

+1

Dla pierwszego punktu użyję funkcji jako przykładu. Zanim programista będzie mógł wywołać myfunc(), programista musi opisać myfunc() kompilatorowi za pomocą prototypu funkcji. Jeśli kilka różnych plików .cpp wywołuje funkcję myfunc(), prototyp musi być dostarczony w każdym pliku .cpp. Jest to błąd podatny na wypisywanie prototypu w każdym pliku .cpp. Dlatego prototyp funkcji znajduje się w pliku .h, który jest #included w każdym pliku .cpp, w którym jest wywoływany myfunc. Pliki nagłówkowe zawierają tylko informacje o kompilatorze, a nie kod, który jest wykonywany. Dlatego nie ma sensu umieszczać pliku .h na linii g ++. – tgibson