2012-01-17 14 views
6

अधिक विशेष रूप से, typedef 'डी कई मामलों में कई अलग-अलग नामों के साथ क्यों है, और क्यों typedef पॉइंटर प्रकार (समय पर तर्क को अस्पष्ट करना)?विंडोज एपीआई में सबकुछ टाइप क्यों किया गया है?

उदाहरण के लिए:

typedef const WCHAR *LPCWSTR, *PCWSTR;

कि की बात क्या है?

+4

मुझे सबकुछ का पूरा विवरण नहीं पता है लेकिन विंडोज 3.1 के साथ 16-बिट दिनों में वापस सोचें। फिर, पास और दूर पॉइंटर्स के दो अलग-अलग प्रकार के पॉइंटर्स थे। उन्होंने एक समान इंटरफेस के लिए क्रमशः प्रत्येक ('पीसीडब्लूस्ट्र 'और' एलपीसीडब्लूआरटीएच) के लिए सूचक प्रकार परिभाषित किया। माइक्रोसॉफ्ट के पीछे की पिछली संगतता के कारण, हम एपीआई में इन दोनों प्रकारों के कारण छोड़ दिए गए हैं। –

+1

असली सवाल यह है कि, वे अन्य सूचक प्रकारों को टाइप क्यों करते हैं जिनके पास उनके पीछे दूर सूचक इतिहास नहीं है? जैसे हैंडल, एचडब्ल्यूएनडी, हिस्टेंस इत्यादि। जहां तक ​​मुझे पता है, उस सवाल का कोई तर्कसंगत उत्तर नहीं है। – Lundin

+2

@ लंदन: हैंडल, एचडब्ल्यूएनडी और इसी तरह वास्तव में पॉइंटर्स नहीं हैं: वे अपारदर्शी हैंडल हैं जो विंडोज़ (यूजर, जीडीआई, केरल) के कुछ हिस्सों में निजी हैं। दृश्यों के पीछे, वे वास्तव में आंतरिक तालिकाओं या इसी तरह के सूचकांक के रूप में उपयोग किया जा सकता है। वे शून्य के रूप में टाइप किए गए हैं * विशेष रूप से यह स्पष्ट करने के लिए कि उन्हें केवल आस-पास के पास पारित किया जाना चाहिए और कोड को उनकी व्याख्या करने का प्रयास नहीं करना चाहिए (उदाहरण के लिए। उन पर अंकगणित करके - जो दुर्घटना से करना आसान होगा अगर वे int मूल्य कह रहे थे); उपरोक्त प्रश्नोत्तरी में टाइप किए गए लोगों के साथ क्या चल रहा है उससे अलग उद्देश्य। – BrendanMcK

उत्तर

7

पीसीडब्लूस्ट्र और एलपीसीडब्लूस्ट्र दोनों दोनों कारण यह है कि प्राचीन काल में एक अंतर था। एलपीसीडब्लूस्ट्रस्ट कांच का तार होता था *।

4

मेरा मानना ​​है कि इस डिजाइन के मुख्य लक्ष्यों में से एक यह है कि कार्यों के प्रकारों को उनके उद्देश्य और अपेक्षित डेटा प्रारूपों के दस्तावेज के रूप में कार्य करने की अनुमति दी जाए।

+0

पॉइंटर प्रकारों के लिए 'टाइपपीफ' में 'एलपी' और' पी' के बीच क्या अंतर है? मेरा मतलब है कि हम एक उदाहरण देखते हैं जहां वे एक ही चीज़ के लिए 'typedef'd हैं ... –

+5

मैं इस पर गलत हो सकता हूं, लेकिन मुझे लगता है कि यह 16-बिट विंडोज़ से ऐतिहासिक आर्टिफैक्ट है, जहां आपके दोनों पॉइंटर्स थे और 'लम्बी पॉइंटर्स'। वे अलग-अलग प्रकार थे, लेकिन अब केवल 1 प्रकार की आवश्यकता है। दोनों पिछड़ा संगतता के लिए समर्थित हैं। –

18

वहाँ वास्तव में कुछ अलग बातें यहाँ पर जा रहा:

  • पहले पास/सुदूर संकेत: Win16 दिनों में वापस, आप के पास है और अब तक संकेत दिए गए थे; पास पॉइंटर्स मूल रूप से केवल 16 बिट ऑफसेट थे, इसलिए केवल ऐप के डिफ़ॉल्ट डेटा पॉइंटर (डीएस या डेटा सेगमेंट रजिस्टर) के 64k के भीतर ऑब्जेक्ट्स का संदर्भ ले सकता था, लेकिन वे छोटे और तेज़ थे; जबकि एक बड़ा 'दूर पॉइंटर' या लम्बा पॉइंटर दोनों सेगमेंट और ऑफ़सेट दोनों शामिल था, इसलिए 1 एम पता स्थान के भीतर कुछ भी हो सकता है। जब 386 साथ आया, तो यह सब सेगमेंट: ऑफ़सेट बिजनेस आखिरकार चला गया, और सभी पॉइंटर्स 32 बिट एड्रेस स्पेस में बस 32 बिट पते थे। और यही वजह है कि दोनों पी ... और एलपी ... संस्करण हैं।

  • पहले स्थान पर टाइपपीफ से परेशान क्यों हैं? यह सिर्फ एक सुविधा या शॉर्टेंड है: "एलपीस्ट्र" टाइपिंग "कॉन्स चार दूर *" से अधिक सुविधाजनक है। लेकिन यह एक पहचानने योग्य मुहावरे भी बन जाता है: आप एलपीस्ट्रेट देखते हैं और सीधे जानते हैं कि विंडोज़ अपने एपीआई में स्ट्रिंग के साथ कैसे काम करता है।

  • यहां पर एक अमूर्तता भी चल रही है: विंडोज आम तौर पर प्रकार के अपने संस्करणों को परिभाषित करता है और सी संस्करणों के बजाय उनका उपयोग करता है। तो विंडोज एपीआई int के बजाय डीडब्ल्यूओआर का उपयोग करते हैं, या शून्य के बजाय वीओआईडी का उपयोग करते हैं। उस समय सी में कुछ छेद प्लग करने के लिए इसकी आवश्यकता थी - वहां कोई बूल नहीं था, इसलिए बूल को पेश करने से अलग-अलग एपीआई बूलियन मूल्यों (उदाहरण के लिए चार बनाम int) का प्रतिनिधित्व करने के लिए विभिन्न प्रकारों का उपयोग करते हैं। यह कुछ हद तक विंडोज एपीआई को अंतर्निहित सी कार्यान्वयन से स्वतंत्र बनाता है: सी की आवश्यकता नहीं है कि int एक विशिष्ट आकार है: यह कंपाइलर के आधार पर 16 बिट्स या 32 बिट्स हो सकता है। लेकिन एक ओएस एपीआई के लिए, इन चीजों को बिल्कुल निर्दिष्ट करना महत्वपूर्ण है। इसलिए int या long का उपयोग करने के बजाय, विंडोज़ इसके बजाय आईएनटी और लोंग का उपयोग करता है, जिसे यह आवश्यकतानुसार परिभाषित करता है, और जो भी अंतर्निहित सी प्रकार के लिए टाइप किया जाता है, वह वास्तविक काम करता है।

  • अंत में, इनमें से कुछ टाइपिफ़ वास्तव में केवल प्रकार की जानकारी से परे विशिष्ट उपयोगों पर संकेत दे रहे हैं। BOOL और INT दोनों intped के रूप में टाइप किए गए हैं, लेकिन यह स्पष्ट है कि BOOL के रूप में निर्दिष्ट एक एपीआई पैरामीटर को एक वास्तविक/गलत अर्थ में उपयोग नहीं किया जा रहा है, न कि पूर्णांक मान के रूप में। (याद रखें कि यह 'बूल' प्रकार को पूर्ववत करता है।) इसी प्रकार, BYTE - जो हस्ताक्षरित चार है - सुझाव देता है कि एक पैरामीटर वास्तव में अल्फान्यूमेरिक या प्रतीक चरित्र के बजाय 8-बिट संख्यात्मक मान के रूप में उपयोग किया जा रहा है। और एलपीस्ट्रेट इंगित करता है कि मूल्य मनमानी चार मानों को इंगित करने के बजाय, एक एनयूएल-समाप्त स्ट्रिंग होने की उम्मीद है। BSTR और LPWSTR में समान अंतर्निहित टाइपिफ़ है - वे दोनों WCHAR * हैं - लेकिन BSTRs में लम्बा उपसर्ग है और इसलिए SysAllocString API के साथ आवंटित किया जाना चाहिए, यहां एक अलग टाइपिफ़ होने के कारण कोड को दो अलग-अलग रखने और दस्तावेज़ API आवश्यकताओं को रखने में मदद मिलती है: यदि आप एक एपीआई देखते हैं जो एक पैरामीटर के रूप में एक BSTR लेता है, तो आप जानते हैं कि आप केवल एक विस्तृत स्ट्रिंग में नहीं जा सकते हैं, भले ही अंतर्निहित प्रकार समान है, उस पैरामीटर के लिए अतिरिक्त आवश्यकताएं हैं।

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