.H.gch dosyası nedir?


116

Yakın zamanda G ++ ile program yapmam gereken bir sınıf projem vardı.

Makefile kullandım ve nedense bazen bir .h.gch dosyasını geride bıraktı.

Bazen bu, derlemeyi etkilemiyordu, ancak sık sık derleyicinin düzeltilmiş veya anlamsız bir sorun için hata vermesine neden oluyordu.

İki sorum var:

1) .h.gch dosyası nedir ve ne için kullanılır? ve

2) Temizlenmediğinde neden bu tür sorunlara neden olsun?


13
gcc, yanlışlıkla bir .h dosyası derlemesini söylerseniz bunları oluşturur. Bunu yapma :) (önceden derlenmiş bir başlık oluşturmak istemiyorsanız)
jalf

3
GCC dünyasının dışında , .gch dosyalarına .pch adı verilir .
Patapoom

Yanıtlar:


115

Bir .gchdosya önceden derlenmiş başlığıdır.

A .gchbulunmazsa, normal başlık dosyaları kullanılacaktır.

Bununla birlikte, projeniz önceden derlenmiş başlıklar oluşturacak şekilde ayarlanmışsa, mevcut değillerse bunları yapacak ve bir sonraki derlemede kullanacaktır.

Bazen *.h.gchdosya bozulur veya güncel olmayan bilgiler içerir, bu nedenle bu dosyayı silip yeniden derlemek onu düzeltmelidir.


1
Öyleyse neden .gch boyutu genellikle bu kadar büyük?
NAND

38

Bir dosya hakkında bilgi edinmek istiyorsanız, terminali yazmanız yeterlidir.

file filename

file a.h.gch verir:

GCC precompiled header (version 013) for C

2
Benimki (OSX, zsh) sadece .h.gchdosya için "veri" diyor . Bunun için uygun veritabanı dosyalarına ihtiyacınız olduğundan şüpheleniyorum.
Ondrej Slinták



15

Diğer yanıtlar, bir gch dosyasının ne olduğu konusunda tamamen doğrudur. Bununla birlikte, bağlam (bu durumda, g ++ kullanan bir acemi) her şeydir. Bu bağlamda iki kural vardır:

  1. Asla, asla, asla g ++ derleme satırına bir .h dosyası koymayın. Yalnızca .cpp dosyaları. Bir .h dosyası yanlışlıkla derlenirse, tüm * .gch dosyalarını kaldırın

  2. Asla ve asla bir .cpp dosyasını #include ifadesine koymayın.

Birinci kural ihlal edilirse, bir noktada soruda açıklanan sorun ortaya çıkacaktır. İkinci kural ihlal edilirse, bir noktada bağlayıcı birden çok tanımlı sembollerden şikayet eder.


2
1. nokta için örnek olarak bir fonksiyon kullanacağım. Bir programcı myfunc () 'u çağırmadan önce, programcının myfunc ()' u derleyiciye bir fonksiyon prototipi kullanarak tanımlaması gerekir. Birkaç farklı .cpp dosyası myfunc () çağırırsa, prototipin her .cpp içinde sağlanması gerekir. Her .cpp dosyasında prototipin yazılması hataya meyillidir. Bu nedenle, işlev prototipi, işlevim adı verilen her .cpp dosyasında # bulunan bir .h dosyasına yerleştirilir. Üstbilgi dosyaları, çalıştırılan kodu değil, yalnızca derleyici için bilgi içerir. Yani bir .h dosyasını g ++ satırına koymak anlamsızdır.
tgibson

2. kuralınızda, şablon işlevi tanımına sahiplerse .cpp dosyalarını # dahil ederiz
NAND
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.