2015-05-16 9 views
5

सी हेडर नमूना।सी संरचना वाक्यविन्यास

typedef LPVOID UKWD_USB_DEVICE; 

typedef struct _UKWD_USB_DEVICE_INFO { 
    DWORD dwCount; 
    unsigned char Bus; 
    unsigned char Address; 
    unsigned long SessionId; 
    USB_DEVICE_DESCRIPTOR Descriptor; 
} UKWD_USB_DEVICE_INFO, *PUKWD_USB_DEVICE_INFO, * LPUKWD_USB_DEVICE_INFO; 

मेरी समझ

struct एक संरचना को परिभाषित करता है (के बीच भाग {})। संरचना का प्रकार _UKWD_USB_DEVICE_INFO है। बंद होने के बाद }UKWD_USB_DEVICE_INFOan alias to this structure है।

प्रश्न

उसके बाद घोषणाओं का उद्देश्य है। * PUKD_USB_DEVICE_INFO और *LPUKWD_USB_DEVICE_INFODo these pointer aliases का मतलब कुछ अलग है यदि कोई चर को छू रहा है और दूसरे के पास * और लेटरिंग के बीच एक जगह है?

+0

आप "परिभाषा घोषित नहीं कर सकते" = – Mints97

+0

आपकी मदद के लिए सभी को धन्यवाद। आपकी दिशा बहुत शैक्षिक रही है। – Ccorock

उत्तर

5

सी typedef घोषणाएं परिवर्तनीय घोषणाओं के अनुरूप समझा जाता है।

int a, *b; 

मूल्यों प्रकार int की a और प्रकार int* की b की घोषणा की।

typedef int A, *B; 

प्रकार Aint के बराबर और प्रकार int* को B बराबर की घोषणा की। तो, बस वैरिएबल प्रकार क्या होगा यदि यह एक परिवर्तनीय घोषणा थी।

तो हाँ, PUKWD_USB_DEVICE_INFOstruct _UKWD_USB_DEVICE_INFO* के बराबर हो जाता है।

संपादित

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

+0

"सी एक सफेद जगह है"? क्या वहां कोई शब्द गायब है? – Leushenko

+0

नहीं, यह जानबूझकर है। कम से कम 90 के दशक में, यह था सामान्य (मेरे लिए) "सी एक सफेद जगह भाषा" या "सी ++ एक सफेद जगह भाषा है, जैसे बयान देखने के लिए", एक स्पष्टीकरण के बाद कि स्रोत कोड में सफेद जगह महत्वपूर्ण नहीं है। शायद मेरी मी एमोरी गलत है या यह आधुनिक उपयोग नहीं है। – antron

1

हां, यह एक सूचक उपनाम है, फिर आप PUKWD_USB_DEVICE_INFO का उपयोग UKWD_USB_DEVICE_INFO * के रूप में कर सकते हैं। अधिकांश Windows structs ऐसा करते हैं:

enter image description here

तीसरे उर्फ ​​में एल लंबी (सूचक) के लिए खड़ा है यही कारण है, और जब तक मैं बहुत गलत कर रहा हूँ, यह 32/64 बिट कोड में कोई अर्थ नहीं है - यह संभावना एक है 16 बिट सामान से बचे हुए, जैसा कि WNDCLASS परिभाषा के साथ मामला है।

+0

आप एक से अधिक उपनाम का उपयोग क्यों करेंगे? क्या यह संरचना के परिवर्तनीय आकार की अनुमति देने के लिए है? – Ccorock

+0

@Ccorock अद्यतन उत्तर देखें। – szczurcio

+1

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

1

क्या ये पॉइंटर उपनाम हैं?

हां।

क्या इसका मतलब कुछ भी है यदि कोई चर को छू रहा है और दूसरे के पास * और लेटरिंग के बीच एक जगह है?

नहीं सी में, टोकन के बीच की जगह संकलक के लिए कोई मतलब नहीं है। वे कोड को देखने वाले लोगों के लिए केवल पठनीयता बदलते हैं।

मैंने घुंघराले ब्रैकेट के बंद होने के बाद ऑनलाइन एक बहुत से कोड उदाहरण ऑनलाइन उपयोग किए हैं। इस पर कोई अंतर्दृष्टि?

आमतौर पर, और विशेष रूप से इस मामले में, यह प्रतीक नाम कि मई विभिन्न प्रकार का प्रतिनिधित्व अनुमति देने के लिए किया है, लेकिन यह भी नहीं हो सकता

आप इसे अपने आर्किटेक्चर पर देख रहे हैं, P "पॉइंटर" और LP "लंबा पॉइंटर" एक ही प्रकार का होता है।

16-बिट आर्किटेक्चर पर, आप एक अलग शीर्षलेख को देख रहे होंगे और वे प्रकार अलग होंगे।

1

विंडोज प्लेटफार्म पर परिभाषा की यह शैली आम है। 16 बिट हिस्सों में बंटा हुआ आर्किटेक्चर के दिनों में, प्रत्येक संरचना परिभाषा typedef भी 2 सूचक typedefs near और far के लिए (उर्फ लंबे संकेत) था:

typedef LPVOID UKWD_USB_DEVICE; 

typedef struct _UKWD_USB_DEVICE_INFO { 
    DWORD dwCount; 
    unsigned char Bus; 
    unsigned char Address; 
    unsigned long SessionId; 
    USB_DEVICE_DESCRIPTOR Descriptor; 
} UKWD_USB_DEVICE_INFO, NEAR * PUKWD_USB_DEVICE_INFO, FAR * LPUKWD_USB_DEVICE_INFO; 

NEAR संकेत दिए गए 16 बिट विस्तृत और FAR संकेत दिए गए 32 बिट विस्तृत थे। अधिकांश विंडोज एपीआई ने FAR पॉइंटर्स लिया, और उनके प्रोटोटाइप पॉइंटर टाइपीफिफ़ का इस्तेमाल करते थे। संयोग से, LPVOID इस तरह से परिभाषित किया गया था:

typedef void FAR *LPVOID; 

32 बिट Windows 1995 में बाहर आया था और यह पुराने हो गए हैं। संगतता कारणों के लिए और FAR कीवर्ड थोड़ी देर के लिए रखा गया था, जिसे खाली के रूप में परिभाषित किया गया था।

16 बिट विंडोज के साथ संगतता लंबे समय तक बेकार हो गई है, लेकिन अभी भी टाइपिंग के रूप में उपयोग अभी भी उपयोग में है, लेकिन FAR और NEAR कीवर्ड हटा दिए गए थे।

* और PUKWD_USB_DEVICE_INFO के बीच की जगह को अनदेखा किया गया है, लेकिन मैं आपसे सहमत हूं कि यह वहां एक को रखने में भ्रमित है।

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