2013-02-14 12 views
53

के बीच अंतर उद्देश्य-सी में अक्सर ब्लॉक के साथ व्यवहार करते समय __typeof__(obj) का उपयोग करते हैं। __typeof(obj) या typeof(obj) क्यों नहीं।टाइपफ, __typeof और __typeof__ (उद्देश्य-सी)

किस का उपयोग करने के लिए?

+2

मुझे पता है कि किसी और ने एक समान सवाल पूछा है, लेकिन दुर्भाग्य से यह तीनों को कवर नहीं किया गया है। http://stackoverflow.com/questions/7618873/is-there-any-difference-between-typeof-and-typeof और C++ – hfossli

+1

हम्म के लिए था। मैंने हमेशा '[obj isKindOf: otherObj]' जैसी संरचनाओं का उपयोग किया है। –

+1

क्षमा करें, हाँ। isKindOfClass कुछ और है। –

उत्तर

47

__typeof__() और __typeof() सी भाषा में कंपाइलर-विशिष्ट एक्सटेंशन हैं, क्योंकि मानक सी में ऐसे ऑपरेटर शामिल नहीं हैं। मानक सी को डबल-अंडरस्कोर के साथ भाषा एक्सटेंशन को उपसर्ग करने की आवश्यकता होती है (यही कारण है कि आपको अपने कार्यों, चर, आदि के लिए ऐसा क्यों नहीं करना चाहिए)

typeof() बिल्कुल वही है, लेकिन विंडो को अंडरस्कोर फेंकता है यह समझने के साथ कि हर आधुनिक कंपाइलर इसका समर्थन करता है। (असल में, अब मैं इसके बारे में सोचता हूं, विजुअल सी ++ शायद नहीं। यह decltype() का समर्थन करता है, हालांकि आमतौर पर typeof() के समान व्यवहार प्रदान करता है।)

सभी तीनों का एक ही बात है, लेकिन कोई भी मानक सी नहीं है संकलक किसी भी मतलब कुछ अलग करने का चयन कर सकते हैं।

+2

वाक्य "यदि आप एक हेडर फ़ाइल लिख रहे हैं जो आईएसओ सी प्रोग्राम में शामिल होने पर काम करना चाहिए, तो निम्न पेज पर 'टाइपफ'' के बजाय' __typeof__' लिखें, हालांकि कुछ प्रकार के "मानक" को इंगित करता है: http://gcc.gnu.org/onlinedocs/gcc/Typeof.html – trojanfoe

+1

हां, भाषा में उस गैर-मानक एक्सटेंशन में उन्हें '__' के साथ पूर्व-मानक के रूप में चिह्नित करने के लिए उपसर्ग किया जाना चाहिए। 'typeof()' तकनीकी रूप से * खराब * सी है, न केवल * गैर मानक * सी –

+2

ठीक है एक। मेरे पास कभी भी सी प्रोग्रामिंग के 20-सालों में इस सुविधा का उपयोग करने का कोई कारण नहीं है। मैं अभी शुरू करने वाला नहीं हूं ;-) – trojanfoe

4

आशा इस मददगार होगा:

-ansi और विभिन्न -std विकल्प कुछ कीवर्ड अक्षम। इससे आपको समस्या होती है जब आप जीएनयू सी एक्सटेंशन, या एक सामान्य प्रयोजन हेडर फ़ाइल का उपयोग करना चाहते हैं जो आईएसओ सी प्रोग्राम समेत सभी कार्यक्रमों द्वारा प्रयोग योग्य होना चाहिए। कीवर्ड asm, typeof और inline -ansi या -std के साथ संकलित प्रोग्रामों में उपलब्ध नहीं हैं (हालांकि इनलाइन का उपयोग -std = c99 या -std = c11 के साथ संकलित प्रोग्राम में किया जा सकता है)। आईएसओ सी 99 कीवर्ड प्रतिबंध केवल तभी उपलब्ध होता है जब -std = gnu99 (जो अंत में डिफ़ॉल्ट होगा) या -std = c99 (या समकक्ष -std = iso9899: 1999), या बाद के मानक संस्करण के लिए एक विकल्प का उपयोग किया जाता है।

इन समस्याओं को हल करने का तरीका प्रत्येक समस्याग्रस्त कीवर्ड की शुरुआत और अंत में '__' रखना है। उदाहरण के लिए, एएसएम के बजाय __asm__ का उपयोग करें, और इनलाइन के बजाय __inline__ का उपयोग करें।

http://gcc.gnu.org/onlinedocs/gcc/Alternate-Keywords.html#Alternate-Keywords

+2

यह '__typeof__' बताता है, लेकिन' __typeof' के बारे में क्या है? –

25

दूसरों का उल्लेख किया है के रूप में, typeof()सी संबंधित compilers में विभिन्न समर्थन हासिल है कि का एक विस्तार है।
यदि आप आईओएस या मैक ऐप्स के लिए उद्देश्य-सी लिखना चाहते हैं, तो संभावना है कि आप क्लैंग कंपाइलर के साथ अपने ऐप को संकलित करेंगे।

बजना typeof() के उपयोग का समर्थन करता है, लेकिन तकनीकी रूप से यह जब अपने सी भाषा बोली एक gnu * प्रकार होना सेट किया गया है के लिए है। हालांकि __typeof__() दोनों सी * और gnu * भाषा बोलियों में समर्थित है - जैसा कि क्लैंग documentation में विस्तृत है।

अब आप Xcode के साथ अपने कोड लिख रहे हैं, सी भाषा बोली के लिए डिफ़ॉल्ट सेटिंग GNU99 और 'एएसएम' 'इनलाइन' 'typeof'हाँ पर सेट है की अनुमति के विकल्प प्रतीत होता है, इसलिए typeof() का उपयोग करके आपको कोई समस्या नहीं आएगी।

Xcode project settings

आप होने के लिए (यकीनन) सुरक्षित जब बजना संकलक का उपयोग कर, __typeof__() का उपयोग करें। इस तरह से आप प्रभावित नहीं होंगे यदि सी भाषा बोली का उपयोग संकलन में परिवर्तन के लिए किया जा रहा है या यदि कोई 'टाइपऑफ' के भत्ते को बंद करने का निर्णय लेता है।

+1

[सी 11 _ जेनेरिक एक विकल्प है] (http://stackoverflow.com/a/25893397/895245) –

+0

__typeof के बारे में क्या? –