2011-09-02 15 views
8

कुछ स्रोत (सीपीपी) फ़ाइलों में #pragma hdrstop (कोई फ़ाइल नाम पैरामीटर) डालने का व्यावहारिक मूल्य ("यह क्या करता है") क्या है?पैरामीटर के बिना #pragma hdrstop जब एक से अधिक फ़ाइलों में इस्तेमाल किया क्या करता है?

ध्यान दें कि MSDN docs (एक बार फिर से) मेरे लिए मिट्टी के रूप में स्पष्ट हैं।

संपादित/नोट: मैं यह पूछ रहा हूं, क्योंकि this answer और यह लेख उस अनुशंसा के लिए लिंक करता है। लेकिन मुझे समझ नहीं आता क्या लाभ यह प्रत्येक संकलन इकाई के लिए एक अलग PCH फ़ाइल होना आवश्यक है।

उत्तर

10

मूल प्रश्न का उत्तर यह है कि न तो/वाईसी या/यू सेट के साथ फ़ाइल में #pragma hdrstop होने का उद्देश्य यह है कि इसे अनदेखा किया जाता है और इसलिए आप एक बिल्ड कॉन्फ़िगरेशन सेट अप कर सकते हैं जो प्रीकंपिल्ड हेडर और अन्य के बिना बनाता है विन्यास कि precompiled हेडर के साथ निर्माण का निर्माण और आप कोड या हेडर है कि सभी में शामिल किए गए हैं ऐसा करने के लिए बदलने की जरूरत नहीं है।

अधिक जानकारी ...

एमएसडीएन पर नोट्स का कहना है कि "एचडीआरस्टॉप प्राग्मा आपको प्रीकंपिलेशन फ़ाइल नामों और उस स्थान पर अतिरिक्त नियंत्रण देता है जिस पर संकलन स्थिति सहेजी जाती है।" जो सच है, लेकिन यह विशेष रूप से स्पष्ट नहीं है कि यह कितना उपयोगी हो सकता है ...

संक्षेप में।

  • #pragma hdrstop को उस स्रोत फ़ाइल में डालकर जो/YC या/Y के साथ संकलित नहीं है, बिल्कुल कोई प्रभाव नहीं पड़ता है।
  • यदि आपके पास फ़ाइल के लिए/yu सेट है तो hdrstop संकलक को उस पंक्ति से पहले सब कुछ फेंकने के लिए कहता है जिस पर hdrstop प्रकट होता है और इसके बजाय precompiled शीर्षलेख डालें।
  • यदि/yc फ़ाइल के लिए सेट है तो hdrstop का मतलब है कि सभी संकलित स्थिति को उस पंक्ति तक ऊपर से बचाएं जिस पर hdrstop precompiled शीर्षलेख के रूप में प्रकट होता है।

चाल वैकल्पिक हेडर फ़ाइल नाम के बिना/वाईसी और/यू का उपयोग कर रही है; बस 'उपयोग' या 'बनाएं' रेडियो बटन की जांच करें और 'हेडर के माध्यम से' संपादित करें बॉक्स को खाली करें (या प्रोजेक्ट फ़ाइल संपादित करें ...)।

तो तुम 1 फ़ाइल, संभवतः PrecompiledHeader.cpp कहा जाता है जो शीर्ष लेख है कि आप precompiled शीर्ष लेख में शामिल करना चाहते हैं और जो फ़ाइलों में शामिल हैं की सूची के अंत में hdrstop #pragma है शामिल है। यह एक फ़ाइल/वाईसी के साथ संकलित है।

आपके पास आपके प्रीकंपील्ड हेडर में मौजूद फ़ाइलों को शामिल करने के बाद #pragma hdrstop के साथ आपकी सभी अन्य सीपीपी फ़ाइलें हैं। इन फ़ाइलों को सभी/यू के साथ संकलित कर रहे हैं।

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

ऐसा करने में लाभ यह है कि आपकी फ़ाइलों में से कोई भी 'ग्लोबल' प्रीकंपील्ड हेडर बिल्डिंग हेडर फ़ाइल शामिल करने की आवश्यकता नहीं है - इसलिए कोई stdafx.h या जो कुछ भी नहीं है। इसका मतलब यह है कि आप एक बिल्ड कॉन्फ़िगरेशन सेट अप कर सकते हैं जो प्रीकंपिल्ड हेडर के बिना बनाता है जहां सभी #pragma hdrstop लाइनों को आसानी से अनदेखा कर दिया जाता है।

यह "अच्छा" है क्योंकि इसका मतलब है कि आपके पास एक 'नो प्रीकंप' बिल्ड कॉन्फ़िगरेशन हो सकता है जो आपको जल्दी से विकसित करने देता है (आप एक ही शीर्षलेख बदल सकते हैं और दुनिया को पुनर्निर्माण के लिए मजबूर नहीं कर सकते) और अन्य "सामान्य" कॉन्फ़िगरेशन कि precompiled हेडर का उपयोग करें।

+0

धन्यवाद। आपका बहुत बहुत धन्यवाद! ... अब, हम्म ... * "फिर आपके पास अपने सभी अन्य सीपीपी फाइलें हैं जिनमें # प्रीग्म्प्लेड हेडर में मौजूद फ़ाइलों को शामिल करने के बाद #pragma hdrstop है।" * - क्या इसका मतलब यह है कि अन्य फाइलों को यह जानने की ज़रूरत है कि इसमें क्या है प्रीकंपिल्ड हेडर ताकि वे एचडीआरस्टॉप लाइन के पहले और बाद में अपने विभाजन को विभाजित कर सकें? –

+2

यदि आप करते हैं तो यह बेहतर काम करता है। लेकिन आपको नहीं करना है। यदि आपके पास #pragma hdrstop से ऊपर की एक फ़ाइल है जो आपके प्रीकंपील्ड हेडर में नहीं है, तो आपको अपने प्रीकंप में बिल्ड त्रुटियां मिलेंगी। फिर आप तय कर सकते हैं कि क्या यह प्रीकंप में होने के लिए व्यापक रूप से पर्याप्त रूप से उपयोग किया जाता है या नहीं। –

5

#pragma hdrstop से पहले सभी कोड एक प्रीकंपील्ड हेडर का हिस्सा होंगे।

precompiled शीर्ष लेख फ़ाइल के नाम के अनुसार निर्धारित होता है: कोई filename पैरामीटर दिया जाता है, तो शीर्ष लेख के नाम के रूप में the documentation में उल्लेख किया है, एक .PCH विस्तार के साथ स्रोत फ़ाइल के आधार नाम होगा निम्नलिखित नियम श्रेष्ठता के क्रम में:

  1. /Fp संकलक विकल्प

  2. फ़ाइल नाम तर्क के लिए तर्क hdrstop #pragma को

  3. एक .PCH विस्तार के साथ स्रोत फ़ाइल के आधार नाम

तो, अगर आपको लगता है कि blah.cpp नाम की एक फ़ाइल पर यह blah.pch नाम की एक फ़ाइल, आईएफएफ /Yc साथ संकलित उत्पादन करेगा है (जो केवल एक फ़ाइल सेट होना चाहिए)।

+0

यह ऐसी चीज है जो तब होती है जब आप विकल्प 0, 1 और 2 बाईपास करते हैं।/यू का उपयोग करना बहुत सार्वभौमिक है, विकल्प 0. –

4

यदि आपका सी में #pragma hdrstop का उपयोग नहीं/C++ परियोजना, आप काव्य बनाया .pch के लिए स्रोत फ़ाइल के रूप में एक समर्पित .cpp फ़ाइल है।

एक .cpp फ़ाइल जिसके साथ आप .pch फ़ाइल बनाने के लिए इच्छा में #pragma hdrstop का उपयोग कर रहे हैं, तो .cpp फ़ाइल #pragma hdrstop की लाइन के बाद अन्य उपयोगी सामग्री हो सकती है। जब आप पहली बार इस .cpp फ़ाइल को/Yc संकलन विकल्प के साथ संकलित करते हैं, तो आपको .pch फ़ाइल और .obj फ़ाइल मिलती है। जब आप .cpp फ़ाइल को बदलते हैं और इसे/Yu संकलन विकल्प के साथ पुन: संकलित करते हैं, तो संकलक सामग्री को #pragma hdrstop की लाइन के साथ .pch फ़ाइल के साथ बदलता है और #pragma hdrstop की रेखा के बाद भाग को पुन: संकलित करता है, एक नई .obj फ़ाइल बनाते हैं, संकलन को सहेजते हैं पहर। यह बहुत उपयोगी है कि आपके प्रोजेक्ट में केवल एक स्रोत फ़ाइल है।

स्रोत फ़ाइलों के लिए केवल प्रीकंपाइल हेड फाइलों का उपयोग करते हुए, #pragma hdrstop कंपाइलर के लिए एक ऐतिहासिक स्थल है जिसे भाग .pch फ़ाइल द्वारा प्रतिस्थापित किया जाना चाहिए, इसलिए आपको हेडर फ़ाइल नाम/yu संकलन विकल्प के साथ इंगित करने की आवश्यकता नहीं है।

+0

धन्यवाद। यह जवाब * कुछ * भावना बना रहा है। तो आपको समझने के लिए * समान * सीपीपी फ़ाइल को विभिन्न कंपाइलर स्विच के साथ संकलित करना होगा? –

+0

हां। एक सी/सी ++ परियोजना एक से अधिक .pch फ़ाइलों का उपयोग कर सकते हैं। आप प्रत्येक स्रोत फ़ाइल के लिए/yu संकलन विकल्प या #pragma hdrstop द्वारा .pch निर्दिष्ट कर सकते हैं। – ligand

+0

मुझे इतना समझ आया। मैं जो पूछना चाहता था वह था: यह समझने के लिए, हमारे पास एक 'U.cpp' है जिसे हमेशा'/Yu 'और दूसरा' c.cpp 'के साथ संकलित किया जाता है जिसे हमेशा '/ Yc' के साथ संकलित किया जाता है? * या * क्या हमारे पास एक एकल 'UC.cpp' है जिसे'/Yc' के साथ संकलित किया गया है और फिर '/ Yu' के साथ ?? –

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