¿Hay alguna forma de suprimir las advertencias en Xcode?

119

¿Hay alguna forma de suprimir las advertencias en Xcode?

Por ejemplo, estoy llamando a un método no documentado y, dado que el método no está en el encabezado, recibo una advertencia al compilar. Sé que puedo agregarlo a mi encabezado para detener la advertencia, pero me pregunto si hay otra forma además de agregarlo al encabezado (para poder mantener los encabezados limpios y estándar) para suprimir la advertencia. ¿Un pragma o algo así?

kdbdallas
fuente
sí, a veces necesita decirle al compilador que no le advierta sobre cualquier variable no utilizada (según él), pero en realidad es posible que la esté usando comoBOOL ok = [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&d interval:NULL forDate:self]; NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);
signo de verano

Respuestas:

145

Para deshabilitar las advertencias por archivo, usando Xcode 3 y llvm-gcc-4.2 puede usar:

#pragma GCC diagnostic ignored "-Wwarning-flag"

Donde el nombre de advertencia es una bandera de advertencia de gcc.

Esto anula cualquier indicador de advertencia en la línea de comando. Sin embargo, no funciona con todas las advertencias. Agregue -fdiagnostics-show-option a su CFLAGS y podrá ver qué bandera puede usar para deshabilitar esa advertencia.

robottobor
fuente
Gracias ! ¡Exactamente lo que necesitaba!
Moszi
28
Una forma fácil de obtener el código de advertencia: vaya al Navegador de registros (Comando + 7), seleccione la compilación superior, expanda el registro (el botón '=' a la derecha) y desplácese hasta la parte inferior.
Neal Ehardt
1
Para aquellos que se preocupan, una referencia educativa de las opciones de advertencia de GCC: gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Levi
2
Parece #pragma GCC diagnostic ignored "-Wwarning-flag"que ya se eliminó
allenlinli
1
@allenlinli todavía está allí, solo necesita reemplazar warning-flagcon una de las advertencias enumeradas en gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Fonix
49

Existe una forma más sencilla de suprimir las advertencias de variables no utilizadas :

#pragma unused(varname)

EDITAR: fuente: http://www.cocoadev.com/index.pl?XCodePragmas

ACTUALIZACIÓN: Me encontré con una nueva solución, una más robusta

  1. Abra Proyecto> Editar destino activo> pestaña Generar.
  2. Debajo User-Defined: busque (o cree si no encuentra una) la clave: GCC_WARN_UNUSED_VARIABLEconfigúrela en NO.

Ejemplo de EDIT-2:

BOOL ok = YES;
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

el compilador muestra una advertencia de variable no utilizada para ok.

Solución:

BOOL ok = YES;
#pragma unused(ok)
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

PD: también puede configurar / restablecer otra advertencia GCC_WARN_ABOUT_RETURN_TYPE::YES/NO

el signo de verano
fuente
31
Aún más simple es poner __unused antes de la declaración de variable.
Mark Leonard
@ mark-leonard debería haber sido una respuesta separada, he estado buscando esto durante días. Tuve que empezar a leer comentarios por desesperación. Gracias.
Reposo el
35

Para gcc puedes usar

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow-ivar"
// your code
#pragma GCC diagnostic pop

Puede aprender sobre GCC pragma aquí y para obtener el código de advertencia de una advertencia, vaya al Navegador de informes (Comando + 9), seleccione la compilación más alta, expanda el registro (el botón '=' a la derecha) y desplácese hasta el abajo y allí su código de advertencia está entre corchetes como este[-Wshadow-ivar]

Para clang puedes usar

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop
Inder Kumar Rathore
fuente
4
Clang admite el pragma de GCC para la compatibilidad con el código fuente existente. Así que solo necesitas escribir pragma en formato gcc.
Allen
1
A partir de Xcode 5.0, Clang fue el único compilador proporcionado. Por lo tanto, es posible que necesite usar pragma en formato clang ahora.
allenlinli
27

Para suprimir una advertencia para un archivo individual, haga lo siguiente:

seleccione el archivo en el proyecto xcode. presione obtener información para ir a la página con opciones de compilación, ingrese -Wno- para negar una advertencia:

-Wno-

p.ej

-Wno-parámetro-no utilizado

Puedes obtener el nombre de la advertencia si miras en la configuración del proyecto las advertencias de GCC ubicadas en la parte inferior de la página de la pestaña de compilación, al hacer clic en cada advertencia, te dirá el nombre del parámetro de advertencia:

p.ej

Advertir siempre que un parámetro de función no se utilice aparte de su declaración. [GCC_WARN_UNUSED_PARAMETER, -Wunused-parameter]

AndersK
fuente
2
Esta es una excelente solución para cuando ha incluido código de una base de código que no desea modificar y que genera advertencias del compilador ...
Mark Beaton
Parece una excelente manera, pero alguna idea de cómo hacer esto en XCode 4
Santthosh
2
Encontré mi solución aquí para XCode 4 stackoverflow.com/questions/6057192/…
Santthosh
si necesita una advertencia de supresión para un solo problema, como el mío: ...m:45:69: Incompatible pointer types sending...abrí la explicación de la compilación y encontré esta advertencia: [-Wincompatible-pointer-types]simplemente lo renombré -Wno-incompatible-pointer-typesy agregué como una bandera a mi .marchivo ... boom, no más advertencias ... +10 si Podría
Nicos Karalis
5

Con Objective-C, una serie de errores graves solo aparecen como advertencias. No solo nunca desactivo las advertencias, normalmente enciendo "Tratar las advertencias como errores" (-Werror).

Cada tipo de advertencia en su código puede evitarse haciendo las cosas correctamente (normalmente lanzando objetos al tipo correcto) o declarando prototipos cuando los necesite.

Matt Gallagher
fuente
14
Si bien este es un buen consejo general, no responde a la pregunta. No todas las advertencias son críticas o serias; muchos son bastante triviales. Supongamos que uno debe usar una biblioteca de terceros y no puede modificarla, por cualquier motivo (base de código heredada, código destinado a ser vinculado por un tercero, estipulación del jefe, etc.) Suprimir advertencias triviales específicas es bastante aceptable en estos casos.
Paul Legato
5

Para deshacerse de la advertencia: intente crear una interfaz de categoría para el objeto en cuestión

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

-(void) myMethod {
...
   [theObject theUndocumentedMethod];
...
}

Aparte, recomiendo encarecidamente no llamar a métodos no documentados en el código de envío. La interfaz puede cambiar y cambiará, y será tu culpa.

Mark Pauley
fuente
Yo también hago esto. Llamo a mi categoría "Privado" y la coloco en la parte superior del archivo .m ... Sirve como una forma de declarar hacia adelante los métodos que solo se usan dentro del archivo. Estoy de acuerdo en que un archivo de encabezado privado sería más estándar, pero tener que rebotar constantemente entre archivos para algo que realmente debería estar completamente contenido (privado) en la implementación es molesto.
Pat Niemeyer
Entonces, resulta que puede usar el viejo truco de C de simplemente implementar el método antes de que cualquier cosa lo use. Entonces tienes un método de archivo local. Sin embargo, creo que no es privado, por lo que otros archivos podrían enviar un mensaje al selector que defina de esta manera.
Mark Pauley
3

Cree un archivo de encabezado nuevo e independiente llamado 'Udocumented.h' y agréguelo a su proyecto. A continuación, cree un bloque de interfaz para cada clase a la que desee llamar funciones no documentadas y asigne a cada una una categoría de '(No documentado)'. Luego, solo incluya ese archivo de encabezado en su PCH. De esta manera, sus archivos de encabezado originales permanecen limpios, solo hay otro archivo que mantener y puede comentar una línea en su PCH para volver a habilitar todas las advertencias.

También utilizo este método para funciones depreciadas en 'Depreciated.h' con una categoría de '(Depreciated)'.

la mejor parte es que puede habilitar / deshabilitar selectivamente advertencias individuales comentando o descomentando los prototipos individuales.

Mark A. Donohoe
fuente
1

Suprimir esa advertencia en particular no es seguro. El compilador necesita conocer los tipos de argumentos y regresa a un método para generar el código correcto.

Por ejemplo, si llamas a un método como este

[foo doSomethingWithFloat: 1.0];

que toma un flotante y no hay ningún prototipo visible, entonces el compilador adivinará que el método toma un doble, no un flotante. Esto puede provocar bloqueos y valores interpretados incorrectamente. En el ejemplo anterior, en una pequeña máquina endian como las máquinas Intel, el método del receptor vería que se pasa 0, no 1.

Puede leer por qué en los documentos ABI de i386 , o simplemente puede corregir sus advertencias. :-)

Conocido
fuente
2
Buen consejo, pero en realidad no responde a la pregunta, como se indicó anteriormente.
Paul Legato