2008-11-12 2 views
15

Ist es möglich, das Attribut __unused attribute für Objective-C-Objektmethodenparameter zu verwenden? Ich habe versucht, es in verschiedenen Positionen um die Parameterdeklaration zu platzieren, aber es verursacht entweder einen Kompilierungsfehler oder scheint ignoriert zu werden (d. H. Der Compiler erzeugt beim Kompilieren mit -Wall -Wextra immer noch nicht verwendete Parameterwarnungen).Verwenden des GCC-Attributs __unused mit Objective-C

Hat jemand das nutzen können? Wird es nur mit Objective-C nicht unterstützt? Als Referenz benutze ich derzeit Apples Build von GCC 4.0.1.

Antwort

18

Okay, ich fand die Antwort ... es scheint ein Fehler bei der Implementierung von Apples gcc 4.0 zu sein. Mit gcc 4.2 funktioniert es wie erwartet und die richtige Platzierung ist die folgende:

-(void)someMethod:(id) __unused someParam; 

Es ist in der Objective-C-Release dokumentiert Aufzeichnungen, wenn jemand interessiert: http://developer.apple.com/releasenotes/Cocoa/RN-ObjectiveC/index.html#//apple_ref/doc/uid/TP40004309-DontLinkElementID_6

Als Hinweis, Ihre Antwort kompilieren, Louis, aber wie ich in meiner Frage gesagt habe, wird es nichts tun oder die unbenutzte Warnung des Compilers unterdrücken.

EDIT: Ich legte einen Fehlerbericht mit Apple für diese rdar://6366051.

2

Ich kann kompilieren das folgende ganz gut:

- (NSString *) test:(__unused NSString *)test { 
    return nil; 
} 

Edit: Eigentlich, die nicht unbedingt ein Bogen Sache sein kann:

Phoenix-VI:CouchPusher louis$ cc -c Pusher.m -Wall -Werror 
Phoenix-VI:CouchPusher louis$ cc -c Pusher.m -Wall -Werror -Wunused-parameter 
cc1obj: warnings being treated as errors 
Pusher.m:40: warning: unused parameter ‘test’ 
Phoenix-VI:CouchPusher louis$ 

So hat -Wall nicht zu enthalten, umfassen nicht -Wunused- Parameter ....

+0

Ja, ich auch kompilieren kann, aber versuchen Sie gcc -Wall -Wextra und sehen, was passiert :) –

+0

Nein, -Wall doesn 't, du brauchst -Wextra dafür ... aber ich benutze immer beide -Wall und -Wextra an meinem Code und ich ärgere mich über das ungenutzte Warnungsrauschen. –

+0

Ich benutze -Werror und die meisten Warnungen, aber ich habe ein paar spezielle Warnungen, die ich traditionell ausschalten-Verwaltete-Parameter, die einer von ihnen sind, da Delegierte oft ungenutzte Parameter haben, die nicht entfernt werden können. –

3

Ich denke, Sie können die #pragma unbenutzt verwenden, um Argumente als unbenutzt zu markieren. Ungeprüfte, aber man kann versuchen, etwas wie

- (NSString *)test:(NSString *)test { 
#pragma unused (test); 
    return nil; 
} 
+1

Sie müssen die Variable in Parens für #pragma unbenutzt einschließen. Also: #pragma unused (timer) funktioniert zwar, aber mir gefällt die Art nicht, die funktioniert. Es stellt sich heraus, dass es sowieso ein Fehler ist. –

3

Ein gemeinsames Idiom ist folgende zu verwenden:

#define UNUSED(x) (void)x 
void SomeFunction(int param1, int param2) 
{ 
    UNUSED(param2); 
    // do stuff with param1 
}

Die UNUSED(param2) Anweisung keinen Objektcode generiert, beseitigt Warnungen über nicht verwendete Variablen und eindeutig dokumentiert den Code so, dass er die Variable nicht verwendet.

+0

Tatsächlich, in diesem Fall, mit -Wall -Wextra enden Sie mit einer Aussage ohne Wirkung Warnung :) –

+0

Behoben - Casting zu void wird diese Warnung los –

+0

Entschuldigung zu stoßen. Da unbenutzt ein Compiler-Hinweis ist, ist das nicht nur so produktiv wie -WNO-unbenutzt? – wjl

1

Nach dem Pragma für eine Weile zu kämpfen, entdeckte ich, dass es

+ (NSString*) runQuery:(id)query name:(NSString*)name options:(NSDictionary*)options 
{ 
#pragma unused(name) 
... 

} 
+0

Ja, ich wollte das unbenutzte Schlüsselwort wirklich in die Methodenzeile schreiben. Aus irgendeinem Grund fühle ich, dass es dort "gehört".Wie auch immer, laut Apple wird es bei GCC vor Version 4.2 einfach nicht unterstützt, das ist es also. Andernfalls, wenn Sie 4.2 oder höher verwenden, funktioniert es wie erwartet :) –

Verwandte Themen