2012-11-16 9 views
5

मैं इस तरह ऑब्जेक्टिव-सी वर्ग कार्यान्वयन के अंदर ग समारोह और चर को परिभाषित कर सकते हैं:सी उद्देश्य और सी वर्ग कार्यान्वयन के अंदर सी फंक्शन और चर?

@implementation MyViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    cfunction(); 
} 

// variable inside class 
NSString *message = @"this is c function inside objective-c class"; 

// c function inside class 
void cfunction() { 
    NSLog(@"%@", message); 
} 

@end 

परिणाम

this is c function inside objective-c class 

इस कोड को कोई चेतावनी और त्रुटियों के बिना काम करता है।
क्या यह वैध उद्देश्य-सी कोड है?
क्या उद्देश्य-सी कक्षा के अंदर चर और सी फ़ंक्शन को परिभाषित करना सुरक्षित है?
क्या इस भाषा विनिर्देशों के बारे में दस्तावेज हैं?

+0

नींव ढांचे को देखें - लगभग सभी सी –

+0

@ जस्टिनमेनर्स धन्यवाद! लेकिन यह सवाल नहीं है "क्या मैं उद्देश्य-सी में सी का उपयोग कर सकता हूं?"। –

+0

मैं देखता हूं - एक उद्देश्य सी कक्षा –

उत्तर

2

हां, यह सही और सुरक्षित है, लेकिन आपको इसे टालने का प्रयास करना चाहिए। यदि आपको कुछ सी-फ़ंक्शन रखना है, तो इसे एक अलग फ़ाइल में परिभाषित करें (और इसे एक अलग शीर्षलेख फ़ाइल में घोषित करें)।

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

+1

"के बारे में अधिक जानकारी" आपको कोडिंग शैली के अनुरूप होना चाहिए और दो भाषाओं को मिश्रण नहीं करना चाहिए। " - * जो * कोडिंग शैली? कैसे * दो "भाषाओं को मिश्रण नहीं करना है? क्या यह खराब शैली है यदि मैं लिखता हूं - (int) foo {वापसी 1 + 2; } ', सिर्फ इसलिए कि '1 + 2' एक सी अभिव्यक्ति है? –

+0

मेरा मतलब मिश्रण नहीं करना था उदा। सी-structs और Obj-C वस्तुओं। सी-फ़ंक्शंस और ओब्जे-सी विधियों को मिश्रण न करें। – kuba

+0

@ क्यूबा धन्यवाद! सामान्य सी में, 'cfunction()' को '-viewDidLoad' से पहले परिभाषित करना होगा। लेकिन अगर मैं @ कार्यान्वयन और @end के बीच 'cfunction() 'को परिभाषित करता हूं, तो' cviewunload ') को' -viewDidLoad' के बाद परिभाषित किया जा सकता है। और जैसा कि H2CO3 ने कहा, 'फ़ंक्शंस सीधे किसी ऑब्जेक्ट के निजी और संरक्षित आइवर तक पहुंच सकते हैं।' मुझे लगता है कि @ कार्यान्वयन के अंदर सी-फ़ंक्शन को परिभाषित करना सी भाषा से अधिक है। लेकिन मुझे दस्तावेज़ीकरण नहीं मिल रहा है। –

2

क्या यह वैध उद्देश्य-सी कोड है?

हाँ, यह है।

क्या उद्देश्य-सी कक्षा के अंदर चर और सी फ़ंक्शन को परिभाषित करना सुरक्षित है?

हाँ, यह है। कक्षाओं के भीतर परिभाषित कार्यों की एक विशेष संपत्ति यह है कि ऐसे कार्य किसी ऑब्जेक्ट के निजी और संरक्षित आइवर तक सीधे पहुंच सकते हैं जो निर्दिष्ट कक्षा का उदाहरण है।

क्या इस भाषा विनिर्देश के बारे में दस्तावेज हैं?

आसपास this SO question.

+0

धन्यवाद। लेकिन मुझे दस्तावेज नहीं मिला [SO सवाल] (http://stackoverflow.com/questions/801976/mixing-c-functions-in-an-objective-c-class)। यदि कोई दस्तावेज नहीं है, तो क्या उस सुविधा पर भरोसा करना खतरनाक है? –

1

क्षमा करें लोग चर्चा देखें, पिछले जवाब इसके तीसरे भाग में बहुत गलत है।

सी उद्देश्य एक उद्देश्य-सी वर्ग के कार्यान्वयन के भीतर कार्यान्वित किया गया है, उस वर्ग के तरीकों, बल्कि सरल, वैश्विक सी कार्यों के तरीके नहीं हैं।

बेशक उन्हें वहां लिखना ठीक है, और कभी-कभी फायदेमंद क्योंकि वे "कक्षा के लिए निजी" हैं - अन्य कोड उन्हें नहीं देख पाएंगे, क्योंकि वे @ कार्यान्वयन के भीतर स्कॉप्ड हैं।

हालांकि - वे किसी भी iVars, या स्वयं, या सुपर, या कक्षा या उदाहरण से संबंधित किसी भी चीज़ तक नहीं पहुंच सकते हैं। वे सी कार्य हैं और ओबीजे-सी विधियों नहीं हैं।

आईवर या स्वयं या सुपर इत्यादि तक पहुंचने का कोई भी प्रयास एक कंपाइलर त्रुटि उत्पन्न करेगा जिसमें "प्रतीक xxx अज्ञात है"।

0

सभी अन्य उत्तर के अतिरिक्त (विशेष रूप से Motti के):

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

यह इस रूप में सरल है:

प्रोटोटाइप:

static void cfunction(); 

कार्यान्वयन:

static void cfunction() { 
    NSLog(@"%@", message); 
} 

-अब एक अलग स्रोत फ़ाइल में कोड से यह कॉल करने के लिए प्रयास करें।

... और उद्देश्य-सी और सी मिश्रण के साथ कुछ भी गलत नहीं है आम तौर पर बोलना: उद्देश्य-सी सुस्त है। सी ++ धीमी और सी काफी तेज है। - यदि आपके पास सबराउटिन (या इनलाइन फ़ंक्शंस) हैं जिन्हें आप बहुत कहते हैं, तो उन सी कार्यों को उद्देश्य-सी के बजाय बनाएं, क्योंकि ओबीजेसी आपके लूप को नीचे खींच लेगा।

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