2010-12-06 7 views
11

tengo esta dentro de una clase personalizada UIActionSheetUtilizando el resultado de una asignación como condición sin paréntesis

if (otherButtonTitles != nil) { 
    [self addButtonWithTitle:otherButtonTitles]; 
    va_list args; 
    va_start(args, otherButtonTitles); 
    NSString * title = nil; 
    while(title = va_arg(args,NSString*)) { // error here 
     [self addButtonWithTitle:title]; 
    } 
    va_end(args); 
} 

tengo este error

! usando el resultado de una asignación como condición sin paréntesis

que apuntan a esta línea

while(title = va_arg(args,NSString*)) { 

por qué es eso?

gracias.

Respuesta

18

Esto probablemente no es un error como dijiste, es advertencia.

El compilador le advierte que debe rodear las asignaciones entre paréntesis cuando está dentro de un condicional para evitar el viejo error asignación-cuando-quiere-comparación.

Para superar esta advertencia del compilador pedante, simplemente se puede rodear la asignación dentro de otro par de paréntesis:

while((title = va_arg(args,NSString*))) { 
//... 
} 
+0

gracias !!! Eso resolvió el problema. La parte más extraña es que solo LLVM es exigente al respecto. GCC lo compila sin previo aviso. Estoy empezando a usar LLVM para compilar, en lugar de GCC y estoy recibiendo algunos errores de selección aquí y allá ... – SpaceDog

+0

@Digital Robot: Recuerdo haber leído en algún lugar que específicamente dice que LLVM verifica esto. Creo que es bueno ser exigente con estas cosas a veces :) – BoltClock

+0

Sí, estoy de acuerdo. : D – SpaceDog

7

Debe ser una advertencia y no un error. Está tratando de advertir en caso de que esté usando = pero se refirió a ==.

En este caso, no eres lo que significa utilizar == debido a que está llamando va_arg() varias veces para recorrer otherButtonTitles y asignarlo a la var temp title, por lo que sólo tiene que añadir otro conjunto de paréntesis. La advertencia desaparecerá.

while((title = va_arg(args,NSString*))) { 
1

compilador cree que está haciendo la asignación por error, lo que sugiere este error. Usted debe envolver su declaración en uno más pares de paréntesis así:

while((title = va_arg(args,NSString*))) 

Entonces compilador primero evaluará la asignación, a continuación, el resultado de esa asignación se hace pasar a la while condición

1

sí parece un poco exigente, pero ¿ha intentado:

while((title = va_arg(args,NSString*)) != NULL) 

?

Cuestiones relacionadas