.H.gch फ़ाइल क्या है?


116

मेरे पास हाल ही में एक क्लास प्रोजेक्ट था जहां मुझे जी ++ के साथ एक कार्यक्रम बनाना था।

मैंने एक मेकफिल का उपयोग किया और किसी कारण से यह कभी-कभी एक .h.gch फ़ाइल को पीछे छोड़ देता था।

कभी-कभी, यह संकलन को प्रभावित नहीं करता था, लेकिन हर बार अक्सर यह कंपाइलर एक समस्या के लिए एक त्रुटि जारी करता था जो तय हो गई थी या जिसका कोई मतलब नहीं था।

मेरे दो सवाल हैं:

1) .h.gch फ़ाइल क्या है और इसका उपयोग किसके लिए किया जाता है? तथा

2) जब इसे साफ नहीं किया गया तो यह ऐसी समस्या क्यों पैदा करेगा?


13
यदि आप गलती से इसे .h फ़ाइल संकलित करने के लिए कहते हैं तो gcc उन्हें बनाता है। ऐसा मत करो :) (जब तक आप वास्तव में एक पूर्वनिर्धारित हेडर नहीं बनाना चाहते हैं)
jalf

3
बाहर जीसीसी दुनिया, .gch फ़ाइलों कहा जाता है .pch
Patapoom

जवाबों:


115

एक .gchफ़ाइल एक पूर्वनिर्धारित हेडर है।

यदि कोई .gchनहीं मिला है, तो सामान्य हेडर फ़ाइलों का उपयोग किया जाएगा।

हालाँकि, यदि आपका प्रोजेक्ट पूर्व-संकलित हेडर बनाने के लिए सेट है, तो यह उन्हें बना देगा यदि वे मौजूद नहीं हैं और अगले बिल्ड में उनका उपयोग करते हैं।

कभी-कभी *.h.gchदूषित हो जाएगा या पुरानी जानकारी होगी, इसलिए उस फ़ाइल को हटाकर उसे फिर से संकलित करना चाहिए।


1
तो .gch का आकार आमतौर पर इतना बड़ा क्यों होता है?
NAND

38

यदि आप किसी फ़ाइल के बारे में जानना चाहते हैं, तो बस टर्मिनल पर टाइप करें

file filename

file a.h.gch देता है:

GCC precompiled header (version 013) for C

2
मेरा (OSX, zsh) .h.gchफ़ाइल के लिए केवल "डेटा" कहता है । मुझे संदेह है कि आपको इसके लिए उचित डेटाबेस फ़ाइलों की आवश्यकता है।
Ondrej Slinták


17

क) वे पूर्वगामी हेडर हैं: http://gcc.gnu.org/oniltocs/gcc/Precompiled-Headed.html

b) उनके पास .h फ़ाइलों से "कैश्ड" जानकारी होती है और हर बार जब आप संबंधित .h फ़ाइल को बदलते हैं, तो उसे अपडेट किया जाना चाहिए। यदि ऐसा नहीं होता है - आपके पास अपनी परियोजना में गलत निर्भरताएं हैं


15

अन्य उत्तर एक gch फ़ाइल क्या है के संबंध में पूरी तरह से सटीक हैं। हालांकि, संदर्भ (इस मामले में, जी ++ का उपयोग करने वाला शुरुआती) सब कुछ है। इस संदर्भ में, दो नियम हैं:

  1. कभी नहीं, कभी, कभी .h फ़ाइल को g ++ संकलन लाइन पर रखें। केवल .cpp फ़ाइलें। अगर .h फ़ाइल कभी संयोग से संकलित होती है, तो * .gch फ़ाइलों को हटा दें

  2. कभी भी, कभी भी, कभी भी .cpp फ़ाइल को #include स्टेटमेंट में न डालें।

यदि नियम एक टूट गया है, तो कुछ बिंदु पर प्रश्न में वर्णित समस्या उत्पन्न होगी। यदि नियम दो टूट गया है, तो कुछ बिंदु पर लिंकर बहु-परिभाषित प्रतीकों के बारे में शिकायत करेगा।


2
1 बिंदु के लिए मैं एक उदाहरण के रूप में एक फ़ंक्शन का उपयोग करूंगा। प्रोग्रामर को myfunc () कॉल करने से पहले, प्रोग्रामर को फंक्शन प्रोटोटाइप का उपयोग करके कंपाइलर को myfunc () का वर्णन करना होगा। यदि कई अलग-अलग .cpp फाइलें myfunc () कहती हैं, तो प्रत्येक .cpp में प्रोटोटाइप उपलब्ध कराना होगा। यह प्रत्येक .cpp फ़ाइल में प्रोटोटाइप टाइप करने के लिए त्रुटि प्रवण है। इसलिए, फ़ंक्शन प्रोटोटाइप को एक .h फ़ाइल में रखा गया है जो प्रत्येक .cpp फ़ाइल में #included है, जहाँ myfunc कहा जाता है। हेडर फ़ाइलों में केवल संकलक के लिए जानकारी होती है, न कि कोड जिसे निष्पादित किया जाता है। तो एक .h फ़ाइल को g ++ लाइन पर रखना अर्थहीन है।
tgibson

आपके नियम 2 में, हम #include .cpp फाइलें बनाते हैं, अगर उनमें टेम्पलेट फंक्शन की परिभाषा है
NAND
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.