2010-03-12 8 views
28

Doublons possibles:
Optional arguments in Objective-C 2.0?
Objective-C Default Argument ValueObjectif C Paramètres par défaut?

J'écris une fonction C dans l'objectif C. Je veux une valeur par défaut pour mon dernier paramètre.

J'ai essayé:

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

mais c'est C++

J'ai aussi essayé

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

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

Mais c'est aussi C++.

Y a-t-il un moyen de faire cela dans Objective C?

+1

Duplicata de http://stackoverflow.com/questions/871796/objective-c-default-argument-value et/ou http://stackoverflow.com/questions/561185/optional-arguments-in-objective-c -2-0, je crois. –

+0

Le premier était moins utile parce que tout le monde a répondu à l'appel de méthode, ou une déclaration incorrecte que vous pouvez avoir deux fonctions foo. Le second est tous les appels de méthode ... –

Répondre

89

Il n'y a pas de paramètres par défaut dans ObjC.

Vous pouvez créer 2 méthodes bien:

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

Pour C: il n'y a rien ajouté spécial au sous-ensemble de C à l'aide ObjC. Tout ce qui ne peut pas être fait en C pur ne peut pas non plus être fait en compilant dans ObjC. Cela signifie que vous ne pouvez pas avoir de paramètres par défaut, ni surcharger une fonction. Créez 2 fonctions à la place.

+5

+1 c'est la bonne façon. :) Même si vous avez vraiment besoin d'une fonction C: utilisez des noms différents. – Macmade

+0

@macmade yeah 'c'est ce que je fais actuellement ... Je pense juste que le style par défaut C++ rend le code un peu plus propre ... –

+0

@Kenny, ouais mais cela n'appartient vraiment à aucune classe. c'est vraiment une fonction C autonome ... –

1

Pour une fonction C - no. Pour une méthode de classe Objective C - oui, il suffit de faire deux méthodes, l'une d'entre elles étant un paramètre court, appelant l'autre méthode. Ou vous pouvez renommer vos sources en .mm et les fonctions C deviennent par magie C++.

+0

C'est une possibilité intéressante ... I ' Je vais devoir calculer le coût de cela dans d'autres parties de mon intégration ... –

+0

Notez que cela change la décoration globale des noms. Vous ne pourrez pas appeler une telle fonction en externe à partir d'une source .m/.c; s'il y a un moyen de déclarer une fonction comme "extern C++", pour ainsi dire, je ne le connais pas. En d'autres termes, si vous allez ObjC++, il vaut mieux le faire tout au long du projet. –

1

Vous pouvez écrire une fonction C avec une liste d'arguments de longueur variable. Vous pouvez utiliser '...' comme type de données pour l'un des paramètres déclarés de votre fonction afin de spécifier où commence la liste d'arguments variables dans la liste des paramètres. (Cela vous permet d'avoir un ou plusieurs arguments requis avant le début de la liste.)

printf() est un exemple d'une fonction écrite avec cette fonction (appelée varargs).

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

Ici, le premier argument est requis, puis peut être suivi de zéro ou plusieurs arguments supplémentaires.

Si vous avez écrit votre fonction de cette façon, elle pourrait fournir une valeur par défaut pour le paramètre manquant.

Questions connexes