2012-11-12 5 views
33

enter image description hereक्या मुझे अभी भी # शामिल गार्ड और #pragma का उपयोग करना चाहिए?

http://en.wikipedia.org/wiki/Pragma_once
मैं अभी भी उपयोग करना चाहिए जब इन compilers के सभी का समर्थन #pragma once गार्ड शामिल हैं?
स्टैक ओवरफ़्लो पर बहुत से प्रतिक्रियाएं संगतता के लिए दोनों का उपयोग करने के लिए कहती हैं, लेकिन मुझे यकीन नहीं है कि यह अभी भी सही है या नहीं। आज कौन से कंपाइलर्स #pragma once का समर्थन नहीं करते हैं?

मुझे यकीन नहीं है कि दोनों का उपयोग करना व्यापक रूप से अपनाया जाने से पहले एक सिफारिश थी, या यदि दोनों तरीकों का उपयोग करने के लिए अभी भी बहुत अच्छे कारण हैं।
केवल #pragma once का उपयोग करने के किसी भी उदाहरण के कारण समस्याएं पैदा होंगी?

+11

याद रखें कि सूचीबद्ध कंपाइलर्स के पुराने संस्करण इसका समर्थन नहीं कर सकते हैं, इसलिए यदि आप ओपन-सोर्स प्रोग्राम बना रहे हैं जिसका स्रोत वितरित किया जाना है तो प्रगति काम नहीं कर सकती है। –

+5

यह केवल कंपाइलर समर्थन के बारे में नहीं है, बल्कि यह भी निर्भर करता है कि पर्यावरण कितना जटिल है। क्या आप निश्चित रूप से * जानने के लिए कंपाइलर पर भरोसा करते हैं * यदि दो फाइलें समान हैं या नहीं, तो सभी netwowrk माउंट्स और प्रतीकात्मक लिंक सहित? –

+2

सूचकांक और विश्लेषक जैसे सहायक उपकरण पर भी विचार करते हैं। कंपाइलर के लिए, जैसा कि उनके पीछे एक पूर्ण प्रीप्रोसेसर या पार्सर नहीं हो सकता है। – justin

उत्तर

13

यह कितना पोर्टेबल अपने कार्यक्रम होने की उम्मीद है पर निर्भर करता है शामिल हैं।

जब तक आप एक प्रोग्राम लिख रहे हैं जो कि कंपाइलर्स के साथ काम करना है, जिसे आप निश्चित रूप से #prama once का समर्थन करते हैं, तो #pragma once का उपयोग करना पर्याप्त होना चाहिए। लेकिन ऐसा करने से आप अपने प्रोग्राम को संकलक सेट करने के लिए प्रतिबंधित करते हैं जो कार्यान्वयन परिभाषित सुविधा का समर्थन करते हैं।

यदि आपको पर सभी प्रोग्रामर पर काम करने के लिए अपने प्रोग्राम की आवश्यकता है तो आपको #pragma once का उपयोग करना चाहिए और दोनों गार्ड शामिल करना चाहिए।

मामले में एक संकलक का समर्थन नहीं करता #pragma once यह बस पर ध्यान नहीं देगा यह [रेफरी # 1], इस तरह के एक मामले में हैडर गार्ड आप उद्देश्य दोनों जब आप जानकारी नहीं है में काम करेगा, इसलिए उन्हें का उपयोग करने में कुछ भी गलत नहीं आपके लक्षित कंपाइलर्स द्वारा समर्थित सुविधाओं का।

तो यदि आप चाहते हैं कि आपका प्रोग्राम विभिन्न कंप्यूटर्स पर 100% पोर्टेबल हो, तो आदर्श तरीका अभी भी केवल गार्ड शामिल हैं। जैसा कि @ चार्ल्सबैली सही मायने में इंगित करता है क्योंकि #pragma once के व्यवहार को परिभाषित किया गया है, अज्ञात कंपाइलर पर व्यवहार आपके प्रोग्राम पर हानिकारक प्रभाव डाल सकता है।


[रेफरी # 1]
स्टैंडर्ड सी ++ 03: 16.6 pragma directive

रूप

# pragma pp-tokensopt new-line

के एक पूर्व प्रसंस्करण के निर्देश का कारण बनता है कार्यान्वयन-परिभाषित तरीके से व्यवहार करने के लिए कार्यान्वयन। कार्यान्वयन द्वारा मान्यता प्राप्त कोई भी प्रगति अनदेखा नहीं की जाती है।

+7

यदि आप चाहते हैं कि आपका प्रोग्राम 100.00% पोर्टेबल हो, तो आपको गार्ड शामिल करने की आवश्यकता है, लेकिन आपको '#pragma एक बार' का उपयोग करने से बचने की भी आवश्यकता है क्योंकि कार्यान्वयन-परिभाषित व्यवहार पर एक अज्ञात कंपाइलर आपके प्रोग्राम पर हानिकारक प्रभाव डाल सकता है। –

+0

@ चार्ल्सबीली: सहमत। जवाब में संशोधन की जरूरत है। मैं ऐसा करूँगा। इंगित करने के लिए धन्यवाद। –

+3

'#pragma एक बार 'विफल हो जाएगा यदि एक ही फ़ाइल ऑपरेटिंग सिस्टम/फ़ाइल सिस्टम स्तर पर दो अलग-अलग नामों से अलियाकृत है। हालांकि, फ़ाइल में एक # शामिल-गार्ड का नाम समान नाम होगा, भले ही फ़ाइल-सिस्टम संदर्भ के बावजूद, और अभी भी काम करेगा। – abelenky

10

यह गैर मानक है, इसलिए यदि आप सुरक्षित उपयोग होना चाहता हूँ गार्ड

5

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

तो मैं कुछ विशिष्ट कोने के मामलों के अलावा या टूटी बिल्ड सिस्टम के लिए कहूंगा #pragma once पर भरोसा करने के लिए अभ्यास में सुरक्षित है। यदि आप केवल #pragma once का उपयोग करके उत्पादकता और कोड गुणवत्ता की परवाह करते हैं तो स्पष्ट विकल्प लगता है।

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

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