दिलचस्प पोस्ट
डी 3 – कैसे JSON डेटा संरचनाओं से निपटने के लिए? setBackground बनाम सेटबैकग्राउंडड्रायबल (एंड्रॉइड) एक स्थानीय डेटाबेस / फोनगैप / कॉर्डोबा / आईओएस में कैमरे के साथ ली गई तस्वीर को कैप्चर करना और संग्रहीत करना एंड्रॉइड: क्या नए संदेशों की संख्या दिखाने के लिए एक संख्या के साथ एक छवि दृश्य / छवि बटन अद्यतन करना संभव है? जावास्क्रिप्ट में एक स्ट्रिंग में एक वर्ण की घटनाओं की संख्या की गणना करें एंड्रॉइड: अतिव्यापी मुद्दा टुकड़े कुछ परिस्थितियों में आवश्यक सत्यापन विशेषता अक्षम करें मैं कैसे निष्क्रिय कर सकता हूँ और पायथन में कंसोल लॉगिंग को पुन: सक्षम कर सकता हूं? कैसे जावास्क्रिप्ट में तारीख अंतर की गणना करने के लिए मैं कैसे css3 उत्तरदायी बना सकते हैं? सरणी संरचना के साथ सरणी के लिए स्ट्रिंग जावा के उपयोग से मूल्य के साथ जंगम सलाखों क्या आप केवल अपने प्रकार के नकली हैं? SQL सर्वर में एक एकल डेटाबेस पर डिफ़ॉल्ट दिनांक समय प्रारूप बदलें फ़ाइल को सभी आउटपुट पर रीडायरेक्ट करें

क्यों रक्षक कई फ़ंक्शन परिभाषाओं को रोकते नहीं हैं?

लिंकर इस पर डुप्लिकेट प्रतीक की रिपोर्ट करता है:

#ifndef testttt #define testttt void anything(){ std::cout<<"hellooooooo"; } #endif 

क्योंकि इसमें गार्ड शामिल है, मुझे उम्मीद है कि यह फ़ंक्शन केवल एक बार परिभाषित किया जाएगा। लेकिन जाहिरा तौर पर नहीं।

मुझे पता है कि मैं इसके सामने static शब्द डाल सकता हूं और फिर यह काम करेगा (जो मुझे अब भी विडंबना मिल रहा है, क्योंकि स्थिर को इसे आंतरिक संबंध देना चाहिए, फिर भी समारोह का उपयोग कई सीपीपी फाइलों से किया जा सकता है)।

इसलिए मुझे लगता है कि मेरा दो-भाग प्रश्न है: 1) गार्ड को इस समारोह की कई परिभाषाएं क्यों नहीं रोकें, जैसे कि वे अन्य शीर्ष लेखों के लिए करते हैं, और 2) static शब्द इस का static क्यों करता है जब स्थिर को नाम से रोका जाना चाहिए अन्य अनुवाद इकाइयों में दृश्यता? मैं इसे जोड़ता हूं, और मैं वास्तव में इस फ़ंक्शन को कहीं से भी कॉल कर सकता हूं जहां यह हैडर फ़ाइल भी शामिल है I

वेब के समाधान से एकत्रित समाधान "क्यों रक्षक कई फ़ंक्शन परिभाषाओं को रोकते नहीं हैं?"

"1) गार्ड इन फ़ंक्शन की कई परिभाषाओं को रोकने में क्यों नहीं शामिल हैं जैसे वे दूसरे शीर्ष लेखों के लिए करते हैं"

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

"2) स्थैतिक शब्द इस का निराकरण क्यों करता है जब स्थैतिक को अन्य अनुवाद इकाइयों में दृश्यता से नामों को रोका जाना चाहिए?"

चूंकि static कीवर्ड हर अनुवाद इकाई के लिए उस फ़ंक्शन का एक निजी प्रति बनाता है

यदि आप चाहते हैं कि फ़ंक्शन को साझा हेडर में परिभाषित किया जाए, तथापि, आपको इसे inline रूप में चिह्नित करना चाहिए, जो आपकी समस्या का समाधान करेगा और पूर्वप्रक्रमक गार्ड को अनावश्यक बना देगा।

गार्ड को इस समारोह की कई परिभाषाओं को रोकने में क्यों शामिल नहीं है जैसे कि वे अन्य शीर्ष लेखों के लिए करते हैं?

सी ++ प्रोग्राम से निष्पादन योग्य बनाने की प्रक्रिया में तीन चरणों होते हैं:

  1. preprocessing
  2. संकलन &
  3. लिंक करना

प्रीप्रोसीटिंग : इस स्टेज के दौरान मैक्रोज़ आदि जैसे प्रीप्रोसेसर निर्देशों को बदल दिया गया है।
संकलन भाषा शब्दों के लिए चेक करके ऑब्जेक्ट कोड में स्रोत कोड को परिवर्तित कर रहा है।
लिंकिंग एक निष्पादन योग्य बनाने के लिए सभी उत्पन्न ऑब्जेक्ट कोड को एक साथ जोड़ने के लिए है।

हेडर गार्ड प्रीप्रोसिंग के दौरान एक ही अनुवाद इकाई में कई बार शामिल किए जाने वाले हेडर की सामग्री को रोकते हैं। वे सामग्री को अलग-अलग अनुवाद इकाइयों में शामिल करने से रोकते हैं। जब आप अलग-अलग अनुवाद इकाइयों में इस हैडर फ़ाइल को शामिल करते हैं, तो इनमें से प्रत्येक इकाई को इस फ़ंक्शन की परिभाषा होगी।
कंपाइलर प्रत्येक अनुवाद इकाई को अलग से एक अलग ऑब्जेक्ट फ़ाइल (। ) का निर्माण करने के लिए संकलित करता है, उनमें से प्रत्येक .ओ फाइल में इस फ़ंक्शन परिभाषा की एक प्रति है। जब लिंकर फ़ंक्शन परिभाषा से लिंक करने की कोशिश करता है तो .exe उत्पन्न करने के समय यह एक ही कार्य की कई परिभाषाओं को प्राप्त करता है, जिससे इस पर भ्रम पैदा हो जाता है जिसके लिए एक से लिंक होता है। इस समस्या से बचने के लिए मानक एक परिभाषा नियम (ओडीआर) के रूप में जाना जाता है एक नियम को परिभाषित करता है, जो एक ही इकाई के कई परिभाषाओं को मना करता है।
जैसा कि आप शीर्ष लेख फ़ाइल में फ़ंक्शन परिभाषा और कई अनुवाद इकाइयों में उस हेडर फ़ाइल सहित देखते हैं, वह ओडीआर का उल्लंघन करती है।
ऐसा करने का सामान्य तरीका हैडर फ़ाइल में घोषणा प्रदान करना और एक में परिभाषा और केवल एक स्रोत फ़ाइल है।

स्थैतिक शब्द इस का निराकरण क्यों करता है जब स्थिर को अन्य अनुवाद इकाइयों में दृश्यता से नामों को रोका जाना चाहिए?

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


यदि आप हेडर फ़ाइल में फ़ंक्शन परिभाषा को शामिल करना चाहते हैं ऐसा करने के 3 तरीके हैं:

  1. समारोह को inline रूप में चिह्नित करें या
  2. कार्य को static रूप में चिह्नित करें या
  3. फ़ंक्शन को एक अनाम नामस्थान में रखें।

ध्यान दें कि #1 और #2 जैसा ऊपर दिए गए दूसरे उत्तर में उल्लेखित किया गया है
#3 के साथ मानक इनलाइन फ़ंक्शन के लिए ओडीआर को आराम देता है और प्रत्येक अनुवाद इकाई को अपनी परिभाषा के लिए अनुमति देता है ( सभी परिभाषाएं समान हैं )।

इसलिए यदि आप वास्तव में हेडर #1 में फ़ंक्शन परिभाषा रखना चाहते हैं तो यह करने का सही तरीका है।

1) गार्ड को इस समारोह की कई परिभाषाओं को रोकने में क्यों शामिल नहीं है जैसे वे अन्य हेडर आइटम्स के लिए करते हैं,

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

एक परिभाषा नियम (ओडीआर) और बाहरी संबंध के बारे में पढ़ें

2) स्थैतिक शब्द इस का निराकरण क्यों करता है जब स्थिर को अन्य अनुवाद इकाइयों में दृश्यता से नामों को रोका जाना चाहिए?

चूंकि static प्रत्येक अनुवाद इकाई के लिए फ़ंक्शन आंतरिक बनाता है। यही आंतरिक संबंध है: अन्य अनुवाद इकाई परिभाषा नहीं देख सकता।