2010-03-12 11 views
28

संभावित डुप्लिकेट:
Optional arguments in Objective-C 2.0?
Objective-C Default Argument Valueउद्देश्य सी डिफ़ॉल्ट पैरामीटर?

मैं उद्देश्य सी में एक सी समारोह लिख रहा हूँ मैं अपने पिछले पैरामीटर के लिए एक डिफ़ॉल्ट मान चाहते हैं।

मैं कोशिश की है:

foo(int a, int b, int c = 0); 

लेकिन यह है कि सी ++

मैं भी

foo(int a, int b, int c) 
{ 
... 
} 

foo(int a, int b) 
{ 
    foo(a, b, 0); 
} 

की कोशिश की है लेकिन यह भी सी है ++ है।

उद्देश्य सी में ऐसा करने का कोई तरीका है?

+1

http://stackoverflow.com/questions/871796/objective-c-default-argument-value और/या http://stackoverflow.com/questions/561185/optional-arguments-in-objective-c का डुप्लिकेट -2-0, मेरा मानना ​​है। –

+0

पहला व्यक्ति कम सहायक था क्योंकि हर किसी ने या तो विधि कॉल के लिए उत्तर दिया था, या एक गलत कथन है कि आपके पास दो foo फ़ंक्शन हो सकते हैं। दूसरा सभी विधि कॉल है ... –

उत्तर

4

नहीं, उद्देश्य-सी डिफ़ॉल्ट पैरामीटर का समर्थन नहीं करता है। देखें similar question

89

ओबीजेसी में कोई डिफ़ॉल्ट पैरामीटर नहीं है।

आप 2 तरीकों हालांकि बना सकते हैं:

-(void)fooWithA:(int)a b:(int)b c:(int)c { 
    ... 
} 
-(void)fooWithA:(int)a b:(int)b { 
    [self fooWithA:a b:b c:0]; 
} 

सी के लिए: कुछ खास नहीं ObjC का उपयोग करके सी सबसेट को जोड़ा गया है। शुद्ध सी में नहीं किया जा सकता है जो कुछ भी ओबीजेसी में संकलित करके किया जा सकता है। इसका मतलब है, आपके पास डिफ़ॉल्ट पैरामीटर नहीं हो सकते हैं, न ही फ़ंक्शन को अधिभारित कर सकते हैं। इसके बजाय 2 फ़ंक्शन बनाएं।

+5

+1 यह सही तरीका है। :) वही है यदि आपको वास्तव में सी फ़ंक्शन की आवश्यकता है: अलग-अलग नामों का उपयोग करें। – Macmade

+0

@macmade हाँ 'यही वह है जो मैं वर्तमान में कर रहा हूं ... मुझे लगता है कि सी ++ डिफ़ॉल्ट शैली कोड को थोड़ा क्लीनर बनाता है ... –

+0

@ केनी, हाँ, लेकिन यह वास्तव में किसी भी वर्ग से संबंधित नहीं है। यह वास्तव में एक स्टैंड अकेले सी समारोह है ... –

1

सी समारोह के लिए - नहीं। एक उद्देश्य सी कक्षा विधि के लिए - हाँ, आप बस दो विधियों को करते हैं, उनमें से एक एक पैरामीटर छोटा है, दूसरी विधि को बुलाता है।

या आप अपने स्रोतों का नाम बदल सकते हैं। एमएम और सी कार्यों जादुई रूप से सी ++ बन जाते हैं।

+0

यह एक दिलचस्प संभावना है ... मैं ' मुझे अपने एकीकरण के अन्य हिस्सों में इसकी लागत का पता लगाना होगा ... –

+0

ध्यान दें कि यह वैश्विक नाम सजावट को बदलता है। आप एक .m/.c स्रोत से बाहरी रूप से ऐसे फ़ंक्शन को कॉल करने में सक्षम नहीं होंगे; यदि कोई फ़ंक्शन "बाहरी सी ++" के रूप में घोषित करने का कोई तरीका है, तो कहने के लिए, मैं इससे परिचित नहीं हूं। दूसरे शब्दों में, यदि आप ओबीजेसी ++ जा रहे हैं, तो आप इसे पूरे प्रोजेक्ट में बेहतर तरीके से करते हैं। –

1

आप एक चर लंबाई तर्क सूची के साथ एक सी समारोह लिख सकते हैं। आप '...' को अपने फ़ंक्शन के घोषित पैरामीटर में से किसी एक के लिए डेटा प्रकार के रूप में उपयोग कर सकते हैं यह निर्दिष्ट करने के लिए कि पैरामीटर सूची में चरम तर्क सूची कहां शुरू होती है। (यह आपको सूची की शुरुआत से पहले एक या अधिक आवश्यक तर्क प्राप्त करने की अनुमति देता है।)

printf() इस सुविधा का उपयोग करने वाले फ़ंक्शन का एक उदाहरण है (जिसे varargs के नाम से जाना जाता है)।

printf(const char *restrict format, ...); 

यहां, पहला तर्क आवश्यक है, और उसके बाद शून्य या अधिक अतिरिक्त तर्कों का पालन किया जा सकता है।

यदि आपने अपना कार्य इस तरह लिखा है, तो यह अनुपलब्ध पैरामीटर के लिए डिफ़ॉल्ट मान प्रदान कर सकता है।

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