learncpp.com के बारे में एक उद्धरण हेडर फाइलों में कभी भी कार्यों को लागू करना है या नहीं:

  1. केवल एक फ़ाइल में उपयोग की जाने वाली कक्षाओं के लिए जो आम तौर पर पुन: प्रयोज्य नहीं होती हैं, उन्हें सीधे उस एकल .cpp फ़ाइल में परिभाषित करें जिसमें उनका उपयोग किया जाता है।
  2. कई फ़ाइलों में उपयोग की जाने वाली कक्षाओं के लिए, या सामान्य पुन: उपयोग के लिए, उन्हें एक .h फ़ाइल में परिभाषित करें जिसका नाम वर्ग के समान है।
  3. ट्रिविअल सदस्य फ़ंक्शंस (तुच्छ कंस्ट्रक्टर या डिस्ट्रक्टर्स, एक्सेस फ़ंक्शंस, आदि…) को क्लास के अंदर परिभाषित किया जा सकता है।
  4. गैर-तुच्छ सदस्य कार्यों को एक .cpp फ़ाइल में परिभाषित किया जाना चाहिए जिसका नाम वर्ग के समान हो।

मान लीजिए कि मैं #3 की सलाह का पालन करता हूं, और मैं my_class.h फ़ाइल में कुछ छोटी विधि my_class::f लागू करता हूं, लेकिन मैं my_class.cpp में लागू होने वाली बड़ी विधियों को छोड़ देता हूं। अगर मैं एक ही प्रोजेक्ट में दो अलग-अलग .cpp फाइलों में my_class.h शामिल करता हूं, तो लिंकर को my_class::f की दो (समान) परिभाषाएं दिखाई देंगी। (यह हेडर गार्ड द्वारा हल नहीं किया जाता है।) मैं समझता हूं कि कुछ लिंकर्स इसे सहन करने के लिए पर्याप्त स्मार्ट हैं (हालांकि मैंने सुना है कि इसमें अतिरिक्त समय लग सकता है)। मेरा सवाल यह है कि:

क्या आपको लगता है कि वे #3 की अनुशंसा करते हैं क्योंकि किसी प्रोजेक्ट में एक ही .h फ़ाइल को दो बार शामिल करना असामान्य है, या क्योंकि लिंकर पर डुप्लिकेट परिभाषा को अनदेखा करने के लिए भरोसा किया जा सकता है, और ऐसा करने में बहुत अधिक समय बर्बाद नहीं होगा?

0
Eric Auld 1 सितंबर 2020, 01:36

2 जवाब

सबसे बढ़िया उत्तर

मैं समझता/समझती हूं कि कुछ लिंकर्स इसे सहन करने के लिए पर्याप्त स्मार्ट हैं

सभी मानक अनुरूप लिंकर इनलाइन फ़ंक्शन की कई समान परिभाषाओं को सहन करते हैं।

डुप्लिकेट परिभाषा को अनदेखा करने के लिए लिंकर पर भरोसा किया जा सकता है

हां।

और ऐसा करने में ज्यादा समय बर्बाद नहीं करेंगे?

मैं लिंकर द्वारा बर्बाद किए गए समय के महत्वपूर्ण होने की उम्मीद नहीं करता।

हालांकि, इनलाइन कार्यों को आम तौर पर प्रत्येक अनुवाद इकाई के लिए संकलित किया जाना चाहिए जहां उनका उपयोग किया जाता है। यदि यह एक विशेष रूप से जटिल कार्य है, तो संकलक (लिंकर नहीं) एक महत्वपूर्ण समय बर्बाद कर सकता है। यही कारण है कि ट्यूटोरियल केवल तुच्छ कार्यों को इनलाइन परिभाषित करने का सुझाव देता है।

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

1
eerorika 1 सितंबर 2020, 02:08

सिफारिश #3 में लिखा है

तुच्छ सदस्य कार्य (तुच्छ रचनाकार या विध्वंसक, पहुँच फ़ंक्शंस, आदि…) कक्षा के अंदर परिभाषित किया जा सकता है

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

1
Vlad from Moscow 1 सितंबर 2020, 01:44