2013-02-18 80 views
8

मैं लिनक्स कर्नेल में नया हूं। मैं फ़ाइल ioctl.h पढ़ रहा हूँ, वहाँ मैं एक मैक्रो _IOC_TYPECHECK(t) का सामना करना पड़ा है, जो इस प्रकार है:आकार (int [1]) का क्या अर्थ है?

#define _IOC_TYPECHECK(t) \ 
     ((sizeof(t) == sizeof(t[1]) && \ 
      sizeof(t) < (1 << _IOC_SIZEBITS)) ? \ 
      sizeof(t) : __invalid_size_argument_for_IOC) 

आप मुझे इस कोड की व्याख्या कर सकते हैं? इस कोड में, sizeof(t[1]) का क्या अर्थ है?

उत्तर

7

इसका उपयोग _IOR/_IOW/_IOWR मैक्रोज़ के तीसरे पैरामीटर की वैधता की जांच करने के लिए किया जाता है, जिसे एक प्रकार माना जाता है। यह जांचता है कि पैरामीटर वास्तव में एक प्रकार है (और एक चर या संख्या नहीं), और अन्यथा एक कंपाइलर या लिंकर त्रुटि का कारण बनता है।

  • तो t, तो t[1] प्रकार "1 t की एक सरणी" है एक प्रकार है। इस प्रकार का आकार t जैसा है, और इसलिए sizeof(t) == sizeof(t[1]) सत्य है।

  • यदि t एक संख्या है, sizeof(t) संकलित करने में विफल रहेगा।

  • यदि t एक साधारण (गैर-सरणी) चर है, तो t[1] एक संकलक त्रुटि का कारण बन जाएगा।

  • तो t एक सरणी चर रहा है, sizeof(t) == sizeof(t[1]) झूठी हो जाएगा, और एक लिंकर त्रुटि के कारण हो जाएगा (क्योंकि __invalid_size_argument_for_IOC परिभाषित नहीं है)।

अभिव्यक्ति sizeof(t) < (1 << _IOC_SIZEBITS) जांच करता है कि प्रकार t का आकार अधिकतम ioctl के लिए अनुमति दी है, और नहीं तो एक ही लिंकर त्रुटि होती है अधिक नहीं है।

अभी भी कुछ अमान्य मामले हैं जो इस मैक्रो द्वारा पकड़े नहीं जाएंगे - उदाहरण के लिए, जब t पॉइंटर के लिए सूचक होता है।

+0

"यदि' t' एक सरणी चर, 'sizeof (टी) == है sizeof (टी [1])' झूठे हो जाएगा "कि वास्तव में हमेशा सही है? –

+0

@AndreasGrapentin: एक तत्व की सरणी के लिए नहीं, लेकिन फिर आपको सीमाओं से सरणी को अनुक्रमणित करने के लिए एक कंपाइलर चेतावनी मिल सकती है। – interjay

3

इसका मतलब sizeof के सभी अन्य उपयोगों के समान है। यह अभिव्यक्ति के आकार की गणना करता है।

इस विशेष मामले में, मुझे संदेह है कि चेक t (जो कि एक प्रकार का नाम होना चाहिए, एक चर नहीं होना चाहिए) को सुनिश्चित करने के लिए है, जिसे मैं संदर्भ से नहीं जानता ... शायद यह संभव है इसे एक सूचक के रूप में इलाज करने के लिए (सरणी अनुक्रमण के लिए आवश्यक) जो कुछ प्रकार से बाहर निकल जाएगा। मैक्रो के बगल में टिप्पणी /* provoke compile error for invalid uses of size argument */ कहती है जो इस सिद्धांत का समर्थन करती है।

ध्यान दें कि sizeof एक ऑपरेटर है, फ़ंक्शन नहीं। कोष्ठक की आवश्यकता नहीं है, सिवाय इसके कि जब आप सीधे किसी प्रकार के आकार की गणना करना चाहते हैं, और फिर वे अभिव्यक्ति का हिस्सा हैं (यह एक कास्ट अभिव्यक्ति है)। तो यह स्पष्टता के लिए sizeof t == sizeof t[1] && ..., या शायद (sizeof t == sizeof t[1]) लिखा जा सकता है।

यह उपयोग करने के लिए एक बहुत अच्छी शैली है, क्योंकि यह t के प्रकार को दोहराने के बजाय आकार को "सरणी" उचित सरणी में गणना की जा रही है। इसलिए, यदि प्रकार बदलना था, तो अभिव्यक्ति स्वचालित रूप से अनुकूलित हो जाएगी और अभी भी सही चीज़ की गणना करेगी।

कई सी प्रोग्रामर किसी कारण से सभी मामलों में sizeof पर तर्क के चारों ओर कोष्ठक रखने पसंद करते हैं।

+1

'यहां t' एक प्रकार, नहीं एक चर माना जाता है। यह [_IOR] (http://h30097.www3.hp.com/docs/dev_doc/DOCUMENTATION/HTML/DDK_R2/DOCS/HTML/MAN/MAN9/0028___R.HTM)/_IOW/_IOWR मैक्रो में किए गए तीसरे पैरामीटर है। – interjay

+0

मुझे नहीं पता था कि 'आकार के' पैराम एक प्रकार के अलावा वैकल्पिक थे; या वे उस मामले में तकनीकी रूप से एक कलाकार हैं। बस इसके लिए +1! – Chowlett

+1

"और फिर वे अभिव्यक्ति का हिस्सा हैं"। मुझे यकीन नहीं है कि मैं समझता हूं कि आपका मतलब क्या है। एक प्रकार पहचानकर्ता (int' तरह ') और कोष्ठक की आवश्यकता नहीं है एक अभिव्यक्ति नहीं है, लेकिन कोष्ठकों' sizeof (int) की आवश्यकता होती है 'कि व्याकरण के नियमों है ... या आप कुछ अलग से मिल रहे थे, क्योंकि? इसके अलावा, यह एक कलाकार नहीं है। –

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

  • कोई संबंधित समस्या नहीं^_^