2008-11-12 9 views
15

¿Es posible utilizar la macro de atributo __unused en los parámetros de método de objeto Objective-C? Intenté ubicarlo en varias posiciones alrededor de la declaración del parámetro pero provoca un error de compilación o parece que se ignora (es decir, el compilador aún genera advertencias de parámetros no utilizados al compilar con -Wall -Wextra).Uso del atributo __unused de GCC con Objective-C

¿Alguien ha podido hacer esto? ¿Simplemente no es compatible con Objective-C? Como referencia, actualmente estoy usando la compilación de GCC 4.0.1 de Apple.

Respuesta

18

Bien, encontré la respuesta ... parece ser un error con la implementación de gcc 4.0 de Apple. Con gcc 4.2 funciona como se esperaba y la colocación correcta es la siguiente:

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

Está documentado en la liberación de Objective-C Notas Si alguien está interesado: http://developer.apple.com/releasenotes/Cocoa/RN-ObjectiveC/index.html#//apple_ref/doc/uid/TP40004309-DontLinkElementID_6

Como nota, su respuesta se compilará, Louis, pero como dije en mi pregunta, en realidad no hará nada ni suprimirá la advertencia no utilizada emitida por el compilador.

EDITAR: He archivado un informe de error con apple para este rdar://6366051.

2

puedo compilar el siguiente bien:

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

Editar: En realidad, que puede no ser estrictamente una cosa arco:

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$ 

Así -Wall no incluya no incluyen -Wunused- parámetro ....

+0

Sí, puedo compilar eso también, pero trate de gcc -Wall -Wextra y ver lo que sucede :) –

+0

No, -Wall doesn 't, necesitas usar -Wextra para eso ... pero siempre uso ambos -Wall y -Wextra en mi código y me molesta el ruido de los avisos no utilizados. –

+0

Utilizo -Werror y la mayoría de las advertencias, pero tengo algunas advertencias específicas que tradicionalmente desactivo -Wunused-parameters es uno de ellos, ya que los delegados suelen tener parámetros no utilizados que no se pueden eliminar. –

3

Creo que puede utilizar #pragma sin usar para marcar los argumentos como no utilizados. No probado, pero se puede intentar algo así como

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

Debe adjuntar la variable en paréntesis para #pragma sin usar. Entonces: #pragma sin usar (cronómetro) funciona, pero realmente no me gusta la forma en que funciona. Resulta que es un error de todos modos. –

3

Un idioma común es el uso de lo siguiente:

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

La declaración UNUSED(param2) no genera ningún código objeto, elimina las advertencias acerca de las variables utilizadas, y claramente documenta el código como que no usa la variable.

+0

En realidad, en este caso, con -Wall -Wextra terminas con una declaración sin advertencia de efecto :) –

+0

Fijo - casting to void se deshace de esa advertencia –

+0

Lamento toparme. Dado que no se utiliza es una sugerencia del compilador, ¿no es esto tan productivo como -no está en uso? – wjl

1

Después de luchar con el pragma por un tiempo, descubrí que es

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

} 
+0

Sí, realmente quería poner la palabra clave no utilizada en la línea del método. Por alguna razón, siento que "pertenece" allí.De todos modos, según Apple, simplemente no es compatible con GCC antes de la versión 4.2, así que eso es todo. De lo contrario, si utiliza 4.2 o superior, funciona como es de esperar :) –

Cuestiones relacionadas