2010-06-03 11 views
11

संभव डुप्लिकेट:
#pragma once vs include guards?#pragma एक बार #if बनाम परिभाषित MYHEADER_INCLUDED_

#pragma once और #if !defined MYHEADER_INCLUDED_ निर्माणों का उपयोग कर में अंतर (प्रदर्शन, प्रयोज्य और कार्यक्षमता में) क्या हैं? या दोनों के बीच क्या अंतर है?

उत्तर

13

विकिपीडिया इस के लिए अपने सभी सवालों के जवाब है और काफी आसान

From the article

C और C++ प्रोग्रामिंग भाषाओं में मिल रहा है, #pragma once एक गैर मानक लेकिन व्यापक रूप से समर्थित पूर्वप्रक्रमक के लिए बनाया गया यह निर्देश है वर्तमान स्रोत फ़ाइल को एकल संकलन में केवल एक बार शामिल करने का कारण बनता है।

इस प्रकार, #pragma once#include गार्ड के रूप में एक ही उद्देश्य में कार्य करता है, लेकिन कई फायदे, सहित के साथ: कम कोड, नाम संघर्ष से बचने के लिए, और बेहतर संकलन गति।

article में फायदे और नुकसान के बारे में अधिक गहराई से देखो। यदि आप वास्तव में रुचि रखते हैं तो मैं सुझाव देता हूं कि आप इसे पूरी तरह से पढ़ लें, न केवल ऊपर की अस्पष्टता।

+0

:) धन्यवाद, मुझे लेख को पढ़ने करते हैं! – bdhar

+0

धन्यवाद डोनल, हाल ही में ब्लॉक कोट बटन का उपयोग करते समय मुझे समस्याएं आ रही हैं इसलिए मैं इससे बचने के लिए प्रयास कर रहा हूं। मुझे इतना आलसी नहीं होना चाहिए और इसे मैन्युअल रूप से करें ... –

6
  1. प्रदर्शन - आम तौर पर #pragma once कार्यान्वयन तेजी से संकलित है, क्योंकि यह मंशा स्पष्ट है
  2. कार्यक्षमता है - दोनों एक ही उद्देश्य पूरा - एक हेडर फाइल के एक से अधिक शामिल किए जाने से बचने के लिए। defined संस्करण व्यापक निश्चित रूप से है भी उपयोग करता है, और अगर इस्तेमाल किया सावधानी से
  3. प्रयोज्य (उदाहरण के लिए सशर्त संकलन के लिए) एक और फ़ाइल में जाँच करने के लिए करता है, तो पूर्व शामिल किया गया था की अनुमति होगी - अगर पोर्टेबिलिटी एक मुद्दा #pragma once साथ जाना नहीं है - हालांकि, यह एक अमानक विस्तार
+2

दिन #pragma मानक बन जाता है, मेरा जीवन थोड़ा बेहतर हो जाएगा। – Mizipzor

+0

@ मिज़िपोजर, मुझे कोई बदबू आना नहीं है '# प्रज्ञा, मैं मॉड्यूल चाहता हूं! http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2073.pdf: डी –

+1

दिन '#pragma once' अनावश्यक हो जाता है, मेरे जीवन में थोड़ा बेहतर हो जाएगा। –

1

Dan McG के रूप में कहा है, वे लगभग एक ही हैं। लेकिन मैं #pragma का उपयोग करने की अनुशंसा नहीं करता जब तक कि कैंट-टावर चीजों (जैसे #pragma सेक्शन) में। यह कोड को अधिक गैर-मानक बनाते हैं।

और कोई कार्यक्षमता/प्रदर्शन समस्या नहीं है। क्योंकि यह समय संकलित करने में है। यह संकलन समय बढ़ा सकता है, लेकिन मुझे कोई अंतर नहीं मिला!

4

जबकि प्रफमा #ifdef गार्ड के कई पहलुओं में एक बार बेहतर है, यह एक प्रमुख दोष है: यह फ़ाइल सिस्टम पथ पर आधारित है: यह मूल धारणा का उपयोग करता है कि दो अलग-अलग (पूर्ण) पथ भी दो अलग-अलग फाइलें हैं। दुर्भाग्य से यह हमेशा सच नहीं है।

हालांकि यह बहुत संभावना नहीं है कि आप इसके साथ समस्या में भाग लेंगे, यह कुछ पता होना चाहिए।

2

जहां तक ​​प्रदर्शन चलता है, मैंने इसे माप नहीं लिया है, लेकिन यह व्यापक रूप से सूचित किया गया है कि कंपाइलर्स # अंतर्निहित गार्ड मुहावरे को पहचानते हैं और इसे उपयोग करने वाली फ़ाइलों को दोबारा दोबारा दोबारा नहीं खोलते हैं (इसलिए उन्हें #pragma once का उपयोग करने के समान व्यवहार करना) ।

कि संभावित प्रदर्शन लाभ की तुलना में अन्य (जो शायद अस्तित्व में नहीं है), मैं देख रहा हूँ थोड़ा कि #pragma once प्रदान करता है - यह जब आप एक नया हेडर बनाने के लिए कुछ हद तक अधिक सुविधाजनक है - लेकिन गार्ड वास्तव में उस जगह में डाल करने के लिए महती नहीं हैं। चूंकि #pragma once विशेष रूप से आकर्षक नहीं है और चूंकि मैं कभी-कभी एक कंपाइलर से निपटता हूं जो इसका समर्थन नहीं करता है, मैं गार्ड का उपयोग करता हूं।

यदि यह दिखाया गया था कि #pragma once एक महत्वपूर्ण प्रदर्शन प्रभाव नहीं पड़ा, मैं निश्चित रूप से इसे का उपयोग शुरू होगी।

कहा - मैं चाहता हूँ कि सी ही हेडर एक बार शामिल करने के लिए परिभाषित किया गया था - जब तक कि कुछ तंत्र इंगित करने के लिए शीर्ष लेख हर बार शामिल किया गया था कार्रवाई की जानी चाहिए लागू किया गया था। वह समय जब आप चाहते हैं कि व्यवहार दूर है, तब तक जब तक आप नहीं करते हैं तब तक गिना जाता है (और मैं अब भी हर बार हेडर में आता हूं जिसमें गार्ड नहीं हैं या #pragma once)। लेकिन यह उस तरह से परिभाषित किया गया था नहीं, इसलिए गार्ड शामिल हैं यह है ... इस पर

3

कुछ और पृष्ठभूमि:

  • Experiments with includes - ढूँढना है कि एक बार की तुलना में तेजी है #pragma दृश्य स्टूडियो 2003/2005 में शामिल
  • Even more experiments with includes - मामलों के विभिन्न प्रकार, बहुत दिलचस्प श्रृंखला के बारे में अधिक जांच कर रहा है, तो आप कई बार निर्माण को कम करने में कर रहे हैं।
1

#pragma once गैर मानक है।

जब आप या आपके एप्लिकेशन की खोज पुस्तकालय का निर्माण नहीं होगा जब आप एक अलग मंच के लिए यह बंदरगाह करने की कोशिश आप अपने हेडर फाइल में से हर एक को बदलने की संभावना के साथ खुश हैं, यह शायद एक अच्छा विकल्प है।

अन्यथा, #ifndef/#define/#endif साथ चिपके रहते हैं। विशेष रूप से यदि आप अन्य लोगों के उपयोग के लिए लाइब्रेरी कोड बना रहे हैं।

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