2010-03-12 14 views
28

duplicados posibles:
Optional arguments in Objective-C 2.0?
Objective-C Default Argument ValueObjetivo C ¿Parámetros por defecto?

estoy escribiendo una función de C en C. Objetivo Quiero un valor por defecto para mi último parámetro.

que he probado:

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

pero eso es C++

También he intentado

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

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

Pero eso también es C++.

¿hay alguna manera de hacer esto en Objective C?

+1

Duplicado de http://stackoverflow.com/questions/871796/objective-c-default-argument-value y/o http://stackoverflow.com/questions/561185/optional-arguments-in-objective-c -2-0, creo. –

+0

El primero fue menos útil porque todos respondieron por llamada de método o una afirmación incorrecta de que puede tener dos funciones de foo. El segundo es todas las llamadas al método ... –

Respuesta

89

No hay parámetros predeterminados en ObjC.

Puede crear 2 métodos sin embargo:

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

Para C: no hay nada especial añadido al subconjunto C mediante el uso de ObjC. Todo lo que no se puede hacer en C puro no se puede hacer compilando en ObjC tampoco. Eso significa que no puede tener parámetros predeterminados ni sobrecargar una función. Crea 2 funciones en su lugar.

+5

+1 esa es la manera correcta. :) Lo mismo si realmente necesita una función C: use diferentes nombres. – Macmade

+0

@macmade sí 'eso es lo que estoy haciendo actualmente ... Creo que el estilo predeterminado de C++ hace que el código sea un poco más limpio ... –

+0

@Kenny, sí, pero esto en realidad no pertenece a ninguna clase. realmente es una función C independiente ... –

1

Para una función C - no. Para un método de clase Objective C: sí, solo hace dos métodos, uno de ellos un parámetro corto, que llama al otro método.

O puede cambiar el nombre de sus fuentes a .mm y las funciones C se convierten mágicamente en C++.

+0

Esa es una posibilidad interesante ... I ' Tendré que calcular el costo de eso en otras partes de mi integración ... –

+0

Tenga en cuenta que esto cambia la decoración global del nombre. No podrá llamar a dicha función externamente desde una fuente .m/.c; si hay una manera de declarar una función como "CTERN externo", por así decirlo, no estoy familiarizado con ella. En otras palabras, si vas ObjC++, es mejor hacer esto durante todo el proyecto. –

1

puede escribir una función C con una lista de argumentos de longitud variable. Puede usar '...' como tipo de datos para uno de los parámetros declarados de su función para especificar dónde comienza en la lista de parámetros la lista de argumentos de variables. (Eso le permite tener uno o más argumentos requeridos antes del inicio de la lista.)

printf() es un ejemplo de una función que se escribe utilizando esta función (conocida como varargs).

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

Aquí, se requiere el primer argumento, y luego puede ir seguido de cero o más argumentos adicionales.

Si escribió su función de esta manera, podría proporcionar un valor predeterminado para el parámetro faltante.

Cuestiones relacionadas