2010-08-07 19 views
7

यह WinNT.h रेखा 519 है (संस्करण का निर्माण: 0091)सी/सी ++ प्रीप्रोसेसर की इस पंक्ति का क्या अर्थ है?

#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name 

क्यों हम unused नामक एक अजीब नाम के साथ एक एकल पूर्णांक सदस्य के साथ कोई struct करने के लिए एक सूचक की जरूरत है?

और हम कभी इस तरह कोड की एक पंक्ति का उपयोग करने की आवश्यकता होगी?

HINSTANCE hInstance = new HINSTANCE__; 

कुल मिलाकर एक ही संरचनाओं के साथ विभिन्न डेटा प्रकार घोषणा करते हुए मेरे लिए कोई मतलब नहीं है। इसके पीछे क्या विचार है?

DECLARE_HANDLE(HRGN); 
DECLARE_HANDLE(HRSRC); 
DECLARE_HANDLE(HSPRITE); 
DECLARE_HANDLE(HLSURF); 
DECLARE_HANDLE(HSTR); 
DECLARE_HANDLE(HTASK); 
DECLARE_HANDLE(HWINSTA); 
DECLARE_HANDLE(HKL); 

उत्तर

1

और हम कभी इस तरह कोड की एक पंक्ति का उपयोग करने की आवश्यकता होगी?
HINSTANCE hInstance = नए HINSTANCE__;

आप आमतौर पर एक विंडोज सिस्टम कॉल द्वारा लौटाए गए HINSTANCE मान का उपयोग करते हैं; मैंने कभी इस तरह की रेखा निष्पादित कोड नहीं देखा है।

10

बिंदु ताकि, उदाहरण के लिए, एक HINSTANCE एक को संभालने के लिए आबंटित नहीं है अलग हैंडल विभिन्न प्रकार के लिए के लिए है। अगर वे सभी को "शून्य *" के रूप में परिभाषित किया गया था, तो वहां त्रुटियों की कक्षाएं हैं जिन्हें संकलक का पता नहीं लगा सका।

+0

तो, इसके पीछे विचार पूर्णांक डेटा प्रकार जो कि वे क्या घोषित कर दिया गया के अलावा अन्य प्रयोजनों के लिए उपयोग नहीं किया जाएगा करने के लिए है? –

+0

हां, जो हैंडल प्रकारों के लिए प्रकार की सुरक्षा प्रदान करता है, इसलिए जब आप किसी फ़ंक्शन में एक हिनस्टेंस पास करने का प्रयास करते हैं तो आपको एक त्रुटि मिलती है, जिसके लिए अंतर्निहित संरचना समान होती है। (यह जवाब सिर्फ "हां" होने वाला था, लेकिन स्पष्ट रूप से पर्याप्त वर्बोज़ नहीं था। अतिरिक्त वर्बोजिटी जोड़ा गया।) – janm

+0

आह मैं देखता हूं क्यों सी अज्ञात structs को पैरामीटर के रूप में पैरामीटर के रूप में अनुमति नहीं देता है; अगर यह समान सेटअप के साथ किसी भी समान संरचना के बराबर अज्ञात structs का इलाज करता है, तो यह सी को इस चाल के काम को करने में त्रुटियों का कारण नहीं बनता है। उस ने कहा, मुझे यकीन है कि यह अधिक लचीला कोड की अनुमति देगा, लेकिन कम से कम एक कारण है। यह भी संकेत मिलता है कि पॉइंटर्स पर वास्तविक कोड निर्भरता वास्तव में int का आकार है, अन्यथा हैंडल टूट जाएगा और बहुत सारे कोड को फिर से लिखना होगा। – Dmitry

0

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

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