यह दो जीसीसी एक्सटेंशन — अभिव्यक्ति विवरण ({ ... })
और typeof()
का उपयोग करता है।
- विस्तार की पहली पंक्ति नामित प्रकार
type
के एक चर की घोषणा की।
- विस्तार की दूसरी पंक्ति वैरिएबल या अभिव्यक्ति
x
के समान प्रकार के चर को घोषित करती है।
- तीसरी पंक्ति दो पॉइंटर्स की तुलना करती है, जो केवल दो डमी चर के प्रकारों से मेल खाती है, जो एक पॉइंटर मिस्चैच चेतावनी उत्पन्न करती है (या
-Werror
के साथ संकलित करते समय त्रुटि)।
- अंतिम पंक्ति (
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
स्रोत
2012-05-01 05:30:05
char buffer_array [10]; char * buffer_point; टाइपशेक (टाइपफ (& buffer_array), buffer_point) पहनते हैं "अलग पॉइंटर प्रकारों की तुलना में कलाकारों की कमी होती है"। किस प्रकार का & buffer_array है जो char * नहीं है? – DaVid
'char buffer_array [10] दिया गया;', '& buffer_array' का प्रकार' ''' char' 'या' char (*) [10] 'के सरणी के लिए सूचक है। Arrays पॉइंटर्स नहीं हैं; वे निकट से संबंधित हैं, लेकिन वे एक ही बात नहीं हैं। –
इसे मिला। टाइपोफ (& buffer_array [0]) == टाइपऑफ (buffer_point) – DaVid