2009-03-27 15 views
37

प्रीकंपील्ड हेडर फ़ाइल के लिए सर्वश्रेष्ठ उम्मीदवार क्या हैं? क्या मैं वहां एसटीएल और बूस्ट हेडर रख सकता हूं, भले ही उनके पास टेम्पलेट हों? और क्या यह संकलन के समय को कम करेगा? इसके अलावा, संकलन समय को कम करने के लिए सबसे अच्छी आईडीई सेटिंग्स क्या हैं?प्रीकंपील्ड हेडर में क्या रखा जाए? (एमएसवीसी)

+3

मैं पीसीएच का उपयोग नहीं करना पसंद करता हूं। कारण हैं (1) मुझे सबसे पहले एक सीपीपी फ़ाइल में इसके संबंधित शीर्षलेख के रूप में शामिल करना पसंद है ताकि आप हेडर संकलन (2) को जान सकें, मेरा अनुभव यह है कि पीएच के साथ निर्भरता चेसिंग पूरी तरह से विश्वसनीय नहीं है, और इसके परिणामस्वरूप वृद्धिशील अविश्वसनीय बनता है बहुत बड़ी परियोजनाओं में। मेरी राय में यह संतुलन पर अधिक कुशल है कि पीएच का उपयोग न करें और विश्वसनीय वृद्धिशील बिल्डों के लाभों का आनंद लें। यह अब हालिया विजुअल स्टूडियो संस्करणों के साथ मामला नहीं हो सकता है - इसके साथ मेरा अनुभव अभी भी न्याय करने के लिए पर्याप्त नहीं है। – Permaquid

उत्तर

47

त्वरित उत्तर: एसटीएल और बूस्ट हेडर वास्तव में प्रीकंपील्ड हेडर फ़ाइल में हैं, भले ही ये हेडर फ़ाइलें टेम्पलेट कक्षाएं परिभाषित करें।

एक प्रीकंपील्ड हेडर फ़ाइल उत्पन्न करते समय, एक कंपाइलर हेडर टेक्स्ट (एक महत्वपूर्ण कार्य!) को पार करता है, और इसे कंपाइलर के लाभ के लिए अनुकूलित एक बाइनरी प्रारूप में परिवर्तित करता है।

भले ही टेम्पलेट कक्षाएं अन्य .cpp फ़ाइलों को संकलित किए जाने पर तत्काल हो जाएंगी, फिर भी उन्हें प्रीकंपील्ड हेडर में जानकारी से तत्काल किया जाएगा, जो संकलक को पढ़ने के लिए काफी तेज है।


(बाद में इसके अलावा)

एक बात है कि आप नहीं एक precompiled शीर्ष लेख में शामिल करना चाहिए फ़ाइलों को अपनी परियोजना का हिस्सा हैं और अक्सर बदल रहे हैं, भले ही हर एक .cpp फ़ाइल में शामिल कर रहे हैं इन फाइलें

इसका कारण यह है कि प्रीकंपील्ड हेडर की पीढ़ी में काफी समय लग सकता है, क्योंकि बूस्ट, एसटीएल और विंडोज लाइब्रेरी बहुत बड़ी हैं।

आपके पास एक साधारण फ़ाइल हो सकती है (उदाहरण के लिए "StringDefs.h") जो सबकुछ उपयोग करता है। यदि StringDefs.h stdafx.h में शामिल है, और एक डेवलपर StringDefs.h को छूता है, तो प्रत्येक डेवलपर को पूरे प्रीकंपील्ड हेडर रीकंपाइल तक प्रतीक्षा करना होगा। अगर स्ट्रिंगडिफ्सएच को प्रीकंपील्ड हेडर से बाहर रखा गया था, तो यह बहुत तेज होगा, और प्रत्येक .CPP फ़ाइल के साथ पार्स किया जाएगा।

+0

यह एक उचित बिंदु है - जिसमें अक्सर बदलती फाइलें शामिल होती हैं, कुल मिलाकर बिल्डिंग समय धीमा कर देती हैं। – Andy

+4

आपके पास प्रति .cpp फ़ाइल में केवल 1 प्रीकंपील्ड हेडर फ़ाइल हो सकती है, लेकिन आपके प्रोजेक्ट में कई प्री-कंपाइल हेडर हो सकते हैं। –

+1

आपको पीसीएच को फिर से कंपाइल करने के लिए इंतजार नहीं करना है, बल्कि यह भी उपयोग करने वाली प्रत्येक फाइल के लिए इंतजार करना होगा। –

-1

प्रीकंपील्ड हेडर में कुछ भी डालें कि उस परियोजना में अधिकांश .cpp फ़ाइलों को वैसे भी शामिल किया जाएगा। यह वास्तव में किसी भी शीर्षलेख फ़ाइल के लिए चला जाता है। यह संकलक को इन फ़ाइलों को एक बार पार्स करने की अनुमति देता है, और उसके बाद उसी प्रोजेक्ट में सभी .cpp फ़ाइलों में उस जानकारी का पुन: उपयोग करें।

+2

मैं असहमत हूं, और यह बताने के लिए मेरे जवाब में एक अतिरिक्त खंड लिखा है। –

+0

प्रीकंपिल्ड हेडर को कभी भी * प्रोजेक्ट-स्थानीय हेडर शामिल नहीं करना चाहिए – Tom

+0

मैंने इस गलती सलाह के बाद बड़े पैमाने पर काम किया है और यह बहुत अक्षम है - हर बार जब आप संकलित करते हैं, तो सब कुछ किसी भी बदलाव के लिए संकलित होता है। – Permaquid

6

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

3

मैंने तकनीक पर एक लेख लिखा है जो संकलन समय को कम करता है। इन तकनीकों में से प्रीकंपिल्ड हेडर और उसके आवेदन पर एक पोस्ट here पाया जा सकता है। इसमें सर्वोत्तम प्रथाओं पर एक अनुभाग भी है जो आपको दिलचस्प लग सकता है। सीएमके स्क्रिप्ट जो इसे पारदर्शी रूप से संभालती हैं शामिल हैं।

संबंधित मुद्दे