2012-05-01 28 views
11
#define typecheck(type,x) \ 
({  type __dummy; \ 
     typeof(x) __dummy2; \ 
     (void)(&__dummy == &__dummy2); \ 
     1; \ 
} 

में typecheck के बारे में typecheck.h की फ़ाइल इन कोड में शामिल है। मुझे पता है यह कोड जांचता है कि x पैरामीटर टाइप जैसा ही प्रकार है। लेकिन मैंलिनक्स कर्नेल

(void)(&__dummy == &__dummy2); 

के बारे में कोड क्यों इस तरह से इस हल कर सकते हैं समझ में नहीं कर सकते हैं? दो चर के पहले पते को समझ में आता है? आपके उत्तर के लिए धन्यवाद। या मुझे बताओ मुझे कुछ बिंदु सीखना चाहिए।

उत्तर

7

तुलना संकेत दिए गए एक बाधा उल्लंघन है और एक नैदानिक ​​जारी करने के लिए संकलक की आवश्यकता है। 6.5.9 समानता ऑपरेटरों देखें:

प्रतिबन्ध

निम्नलिखित में कोई एक पकड़ जाएगा:

  • दोनों ऑपरेंड अंकगणित प्रकार है;
  • दोनों ऑपरेटरों संगत प्रकार के योग्य या अयोग्य संस्करणों के लिए पॉइंटर्स हैं;
  • एक ऑपरेंड किसी ऑब्जेक्ट या अधूरे प्रकार का सूचक होता है और दूसरा शून्य के योग्य या अयोग्य संस्करण के लिए सूचक होता है; या
  • एक ऑपरेंड एक सूचक है और दूसरा एक शून्य सूचक स्थिर है।

और 5.1.1।3 निदान:

एक अनुरूप कार्यान्वयन कम से कम एक नैदानिक ​​संदेश (एक कार्यान्वयन से परिभाषित तरीके में पहचान) अगर एक पूर्व प्रसंस्करण अनुवाद इकाई या अनुवाद इकाई किसी भी वाक्य रचना नियम या बाधा का उल्लंघन होता है प्रस्तुत करेगा, यहां तक ​​कि व्यवहार करता है, तो स्पष्ट रूप से अपरिभाषित या कार्यान्वयन-परिभाषित के रूप में भी निर्दिष्ट किया गया है। डायग्नोस्टिक संदेशों को अन्य परिस्थितियों में नहीं बनाया जाना चाहिए।

8

यह दो जीसीसी एक्सटेंशन — अभिव्यक्ति विवरण ({ ... }) और typeof() का उपयोग करता है।

  1. विस्तार की पहली पंक्ति नामित प्रकार type के एक चर की घोषणा की।
  2. विस्तार की दूसरी पंक्ति वैरिएबल या अभिव्यक्ति x के समान प्रकार के चर को घोषित करती है।
  3. तीसरी पंक्ति दो पॉइंटर्स की तुलना करती है, जो केवल दो डमी चर के प्रकारों से मेल खाती है, जो एक पॉइंटर मिस्चैच चेतावनी उत्पन्न करती है (या -Werror के साथ संकलित करते समय त्रुटि)।
  4. अंतिम पंक्ति (1 युक्त) अभिव्यक्ति का मूल्य — सत्य के बराबर है।

तो, x का प्रकार नामित प्रकार जैसा नहीं है, तो आपको संकलन चेतावनी/त्रुटि मिलती है।

उदाहरण कोड:

#include <stdio.h> 

#define typecheck(type,x) \ 
({  type __dummy; \ 
     typeof(x) __dummy2; \ 
     (void)(&__dummy == &__dummy2); \ 
     1; \ 
}) 

int main(void) 
{ 
    int x; 
    if (typecheck(int, x)) 
     printf("int x OK\n"); 
    if (typecheck(double, x)) 
     printf("double x OK\n"); 
    return(0); 
} 

संकलन संदेश: ऐसा इसलिए है क्योंकि मैं -Werror का उपयोग नहीं किया

$ /usr/bin/gcc -O3 -g -std=gnu99 -Wall -Wextra xx.c -o xx 
xx.c: In function ‘main’: 
xx.c:15: warning: comparison of distinct pointer types lacks a cast 
$ 

ध्यान दें, कोड संकलित 'ठीक है'। उत्पादन किया गया था: असंगत प्रकार के साथ

int x OK 
double x OK 
+0

char buffer_array [10]; char * buffer_point; टाइपशेक (टाइपफ (& buffer_array), buffer_point) पहनते हैं "अलग पॉइंटर प्रकारों की तुलना में कलाकारों की कमी होती है"। किस प्रकार का & buffer_array है जो char * नहीं है? – DaVid

+1

'char buffer_array [10] दिया गया;', '& buffer_array' का प्रकार' ''' char' 'या' char (*) [10] 'के सरणी के लिए सूचक है। Arrays पॉइंटर्स नहीं हैं; वे निकट से संबंधित हैं, लेकिन वे एक ही बात नहीं हैं। –

+0

इसे मिला। टाइपोफ (& buffer_array [0]) == टाइपऑफ (buffer_point) – DaVid

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