2010-03-12 11 views
28

mögliche Dubletten:
Optional arguments in Objective-C 2.0?
Objective-C Default Argument ValueZiel C Standardparameter?

ich eine C-Funktion in Objective C. Schreiben mag ich einen Standardwert für meinen letzten Parameter.

Ich habe versucht:

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

aber das ist C++

ich auch

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

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

Aber das ist auch C++.

gibt es eine Möglichkeit, dies in Objective C zu tun?

+1

Duplizieren von http://stackoverflow.com/questions/871796/objective-c-default-argument-value und/oder http://stackoverflow.com/questions/561185/optional-arguments-in-objective-c -2-0, glaube ich. –

+0

Die erste war weniger hilfreich, weil jeder entweder auf Methodenaufruf oder eine falsche Aussage antwortete, dass Sie zwei foo-Funktionen haben können. Die zweite ist alle Methodenaufrufe ... –

Antwort

89

Es gibt keine Standardparameter in ObjC.

Sie können jedoch zwei Methoden erstellen:

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

Für C: gibt es nichts besonderes an die C Teilmenge hinzugefügt von ObjC verwenden. Alles, was nicht in reinem C gemacht werden kann, kann auch nicht in ObjC kompiliert werden. Das heißt, Sie können keine Standardparameter haben oder eine Funktion überladen. Erstelle stattdessen 2 Funktionen.

+5

+1 das ist der richtige Weg. :) Gleiches, wenn Sie wirklich eine C-Funktion benötigen: Verwenden Sie andere Namen. – Macmade

+0

@macmade yeah 'das ist, was ich gerade tue ... Ich denke nur, dass der C++ - Standard-Stil den Code etwas sauberer macht ... –

+0

@Kenny, yeah, aber das gehört eigentlich keiner Klasse an. es ist wirklich eine Stand-alone-C-Funktion ... –

1

Für eine C-Funktion - nein. Für eine Objective-C-Klassenmethode - ja, du machst nur zwei Methoden, eine davon einen kurzen Parameter, die andere Methode aufrufen.

Oder Sie können Ihre Quellen umbenennen, um .mm und C-Funktionen werden magisch zu C++.

+0

Das ist eine interessante Möglichkeit ... I ' Ich muss herausfinden, die Kosten dafür in anderen Teilen meiner Integration ... –

+0

Beachten Sie, dass dies globale Namen Dekoration ändert. Sie können eine solche Funktion nicht extern von einer .m/.c-Quelle aufrufen. wenn es eine Möglichkeit gibt, eine Funktion als "extern C++" zu deklarieren, so bin ich damit nicht vertraut. Mit anderen Worten, wenn Sie ObjC++ gehen, tun Sie dies besser während des gesamten Projekts. –

1

Sie eine C-Funktion mit einer Liste variabler Länge Argument schreiben kann. Sie können '...' als Datentyp für einen der deklarierten Parameter Ihrer Funktion verwenden, um anzugeben, wo in der Parameterliste die Variable Argumentliste beginnt. (Damit können Sie vor dem Start der Liste ein oder mehrere erforderliche Argumente angeben.)

printf() ist ein Beispiel für eine Funktion, die mit dieser Funktion (varargs) geschrieben wird.

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

Hier ist das erste Argument erforderlich, gefolgt von null oder mehr zusätzlichen Argumenten.

Wenn Sie Ihre Funktion auf diese Weise geschrieben haben, könnte sie einen Standardwert für den fehlenden Parameter liefern.