2010-12-06 11 views
11

Ich habe dies in einem benutzerdefinierten UIActionSheet Klasseals Bedingung das Ergebnis einer Zuweisung Verwendung ohne Klammern

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); 
} 

I

diesem Fehler haben! mit dem Ergebnis einer Zuweisung als Bedingung ohne Klammern zu dieser Linie

zeigen

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

warum ist das so?

danke.

Antwort

18

Dies ist in den while Zustand übergeben werden nicht ein Fehler wie Sie sagten, es ist eine Warnung.

Der Compiler warnt Sie, dass Sie Zuweisungen innerhalb von Klammern umgeben sollten, wenn es sich innerhalb einer Bedingung befindet, um den alten Assignment-wenn-Sie-meinen-Vergleich Fehler zu vermeiden.

Um hinter diesem eher pedantisch Compiler-Warnung zu erhalten, können Sie einfach die Zuordnung umgeben in einem anderen Paar Klammern:

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

danke !!! Das hat das Problem gelöst. Der seltsamste Teil ist, dass nur LLVM darüber wählerisch ist. GCC kompiliert es ohne Warnung. Ich fange an, LLVM anstelle von GCC zu kompilieren und ich erhalte hier und da einige Kommissionierfehler ... – SpaceDog

+0

@Digital Robot: Ich erinnere mich, irgendwo gelesen zu haben, wo LLVM ausdrücklich darauf hinweist. Ich denke, dass es gut ist, manchmal über diese Dinge wählerisch zu sein :) – BoltClock

+0

Ja stimme ich zu. : D – SpaceDog

7

Es sollte eine Warnung und kein Fehler sein. Es versucht zu warnen, wenn Sie = verwenden, aber Sie haben == gemeint.

In diesem Fall Sie bedeutet nicht == zu verwenden, da Sie va_arg() mehrfach Aufruf sind durch otherButtonTitles und Zuweisung an die Temp var title, also nur einen weiteren Satz von Klammern iterieren hinzuzufügen. Die Warnung wird weggehen.

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

Compiler denkt, dass Sie Zuordnung versehentlich tun, damit diese Fehler hindeutet. Sie sollten Ihre Aussage in ONE MORE PAIR von Klammern wie diese wickeln:

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

Dann zuerst die Zuordnung wertet Compiler, dann das Ergebnis dieser Zuordnung wird wahrscheinlich

1

Es ist ein wenig pingelig, scheint aber haben Sie versucht:

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

?

Verwandte Themen