मैंने हाल ही में कोशिश की है कि कुछ के लिए सोच रहा हूँ। यह उत्पादन कोड नहीं है, बस कुछ ऐसा है जिसे मैंने एक साथ फेंक दिया और कुछ अजीब व्यवहार किया जिसे मैं समझा नहीं सकता। और शायद अधिक सी ++ अनुभव वाला कोई व्यक्ति जानता है कि क्या हो रहा है।

मेरे पास एक हेडर फ़ाइल है जिसमें इसके अंदर कार्यान्वयन के साथ एक वर्ग है (मुझे लगता है कि इसे इनलाइन करने के लिए कंपाइलर को इंगित करना)। मैंने इस हेडर फ़ाइल को कई सीपीपी फाइलों में शामिल किया है जो एक डीएल को संकलित करते हैं; मैंने फिर एक ही हेडर फ़ाइल को कई सीपीपी फाइलों में उपयोग करने की कोशिश की जो एक lib (स्थिर पुस्तकालय) में संकलित होती है।

और जिन कारणों से मुझे प्रवेश करने की आवश्यकता नहीं है, मैं उस lib में हेडर में एक std के getcurrentthreadid() API का उपयोग नहीं कर सका (लेकिन उसी API को dll को संकलित/लिंक करते समय कोई समस्या नहीं थी)। इसलिए। बस इस मुद्दे को हल करना चाहते हैं (और मुझे पता है कि यह एक अच्छा अभ्यास नहीं है, लेकिन प्रयोग करना चाहता था), मैंने मूल हेडर फ़ाइल को कॉपी-पेस्ट किया, और मैंने उस विशेष कॉल को थ्रेडिड एपीआई में हटा दिया, और इसके बजाय सिर्फ -1 को हार्डकोड किया प्रकार की विधि का उपयोग करना।

तो अब मेरे पास cpps से निर्मित एक dll है जिसमें थ्रेडिड कॉल के साथ .h फ़ाइल, और cpps से एक lib बिल्ड शामिल है जिसमें हार्डकोडेड id = -1 के साथ लगभग समान .h फ़ाइल शामिल है। डीएलएल lib फ़ाइल का संदर्भ देता है।

अब, मेरी जानकारी में, लिब को संकलित करते समय, हेडर सामग्री को पूर्व-संकलन के दौरान सीपीपी फाइलों में इंजेक्ट किया जाता है, और फिर संकलन होता है। मतलब lib फ़ाइल में उस हार्डकोड -1 के साथ ऑब्जेक्ट कोड होना चाहिए। जब मैं डीएलएल संकलित करता हूं, तो अन्य शीर्षलेख फ़ाइल सीपीपी फाइलों में इंजेक्शन हो जाती है, और सीपीपी कोड संकलित किया जाता है। फिर, lib को जोड़ने के दौरान डीएलएल में लोड हो जाता है।

तो मैं रनटाइम पर, हार्डकोडेड -1 का उपयोग करने के लिए lib से कोड, और वास्तविक थ्रेडिड का उपयोग करने के लिए डीएल से कोड की अपेक्षा करता हूं। लेकिन मेरे आश्चर्य के लिए, वे सभी वास्तविक थ्रेडिड का उपयोग करते प्रतीत होते हैं। हालांकि, लिब को संकलित करते समय, इसने थ्रेडिड के बारे में शिकायत की।

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

0
danutz_plusplus 29 मई 2017, 17:51
"अच्छा अभ्यास नहीं" = "अपरिभाषित व्यवहार"। यह अपरिभाषित व्यवहार के लिए पूरी तरह से उचित परिणाम की तरह लगता है।
 – 
MSalters
29 मई 2017, 17:54
1
आपका प्रोग्राम एक परिभाषा नियम का उल्लंघन करके अपरिभाषित व्यवहार प्रदर्शित करता है। विशेष रूप से, वह भाग जो पढ़ता है "प्रत्येक परिभाषा में टोकन के समान अनुक्रम होते हैं" व्यावहारिक रूप से बोलते हुए, संकलक प्रत्येक .obj फ़ाइल में फ़ंक्शन की परिभाषा को उत्सर्जित करता है जो इसका उपयोग करता है, और लिंकर को निर्देश देता है कि एक चुनें - कोई भी - और बाकी को त्याग दें।
 – 
Igor Tandetnik
29 मई 2017, 17:55
हाँ ऐसा लगता है। धन्यवाद
 – 
danutz_plusplus
29 मई 2017, 18:06

1 उत्तर

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

आपका प्रोग्राम एक परिभाषा नियम का उल्लंघन करके अपरिभाषित व्यवहार प्रदर्शित करता है:

[basic.def.odr]/6 एक प्रोग्राम में ... इनलाइन फ़ंक्शन की एक से अधिक परिभाषाएं हो सकती हैं ... बाहरी लिंकेज के साथ ... बशर्ते कि प्रत्येक परिभाषा एक अलग अनुवाद इकाई में दिखाई दे, और बशर्ते परिभाषाएं निम्नलिखित आवश्यकताओं को पूरा करती हों। D नाम की ऐसी इकाई को एक से अधिक अनुवाद इकाई में परिभाषित किया गया है, तो

(6.1) — D की प्रत्येक परिभाषा में टोकन का एक ही क्रम होगा; तथा...

व्यावहारिक रूप से बोलते हुए, एक सामान्य कार्यान्वयन में कंपाइलर फ़ंक्शन के संकलित निकाय को प्रत्येक ऑब्जेक्ट फ़ाइल में उत्सर्जित करेगा जो इसका उपयोग करता है, और लिंकर को किसी एक को चुनने के लिए निर्देश देता है - और बाकी को त्याग दें (इस धारणा के तहत कि वे सभी समान हैं) .

0
Igor Tandetnik 29 मई 2017, 18:03
संदर्भ के लिए धन्यवाद। वह बिल्कुल ऐसा लगता है।
 – 
danutz_plusplus
29 मई 2017, 18:06