C'è un modo per sopprimere gli avvisi in Xcode?


119

C'è un modo per sopprimere gli avvisi in Xcode?

Ad esempio, sto chiamando un metodo non documentato e poiché il metodo non è nell'intestazione ottengo un avviso durante la compilazione. So di poterlo aggiungere alla mia intestazione per interrompere l'avviso, ma mi chiedo se esiste un modo diverso dall'aggiunta all'intestazione (in modo da poter mantenere le intestazioni pulite e standard) per sopprimere l'avviso? Un pragma o qualcosa del genere?


sì, a volte hai bisogno di dire al compilatore di non avvisarti di alcuna variabile inutilizzata (secondo lui) ma in realtà potresti usarla comeBOOL ok = [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&d interval:NULL forDate:self]; NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);
segno dell'estate il

Risposte:


145

Per disabilitare gli avvisi per file, utilizzando Xcode 3 e llvm-gcc-4.2 puoi usare:

#pragma GCC diagnostic ignored "-Wwarning-flag"

Dove il nome dell'avviso è un flag di avviso di gcc.

Ciò sovrascrive qualsiasi flag di avviso sulla riga di comando. Tuttavia, non funziona con tutti gli avvisi. Aggiungi -fdiagnostics-show-option alle tue CFLAGS e puoi vedere quale flag puoi usare per disabilitare quell'avviso.


Grazie ! Esattamente quello di cui avevo bisogno!
Moszi

28
Un modo semplice per ottenere il codice di avviso: vai a Log Navigator (Comando + 7), seleziona la build più in alto, espandi il log (il pulsante "=" a destra) e scorri fino in fondo.
Neal Ehardt

1
Per coloro a cui importa, un riferimento educativo alle opzioni di avviso del GCC: gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Levi

2
Sembra #pragma GCC diagnostic ignored "-Wwarning-flag"sia già stato rimosso
allenlinli

1
@allenlinli è ancora lì, devi solo sostituire warning-flagcon uno degli avvisi elencati in gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Fonix

49

c'è un modo più semplice per sopprimere gli avvisi di variabili inutilizzate :

#pragma unused(varname)

EDIT: fonte: http://www.cocoadev.com/index.pl?XCodePragmas

AGGIORNAMENTO: mi sono imbattuto in una nuova soluzione, una più robusta

  1. Apri il progetto> Modifica destinazione attiva> scheda Costruisci.
  2. Sotto User-Defined: trova (o crea se non ne trovi una) la chiave: GCC_WARN_UNUSED_VARIABLEimpostala su NO.

EDIT-2 Esempio:

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

il compilatore mostra un avviso di variabile inutilizzata per ok.

Soluzione:

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

PS: puoi anche impostare / ripristinare altri avvisi GCC_WARN_ABOUT_RETURN_TYPE::YES/NO


31
Ancora più semplice è mettere __unused prima della dichiarazione della variabile.
Mark Leonard

@ mark-leonard avrebbe dovuto essere una risposta a parte, l'ho cercata da giorni. Ho dovuto iniziare a leggere i commenti per disperazione. Grazie.
Riposo il

35

Per gcc puoi usare

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

Puoi conoscere il pragma di GCC qui e per ottenere il codice di avviso di un avviso vai al Navigatore rapporti (comando + 9), seleziona la build più in alto, espandi il registro (il pulsante "=" a destra) e scorri fino al in basso e lì il tuo codice di avviso è racchiuso tra parentesi quadre come questo[-Wshadow-ivar]

Per clang puoi usare

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

4
Clang supporta il pragma di GCC per la compatibilità con il codice sorgente esistente. Quindi devi solo scrivere pragma in formato gcc.
Allen

1
A partire da Xcode 5.0, Clang era l'unico compilatore fornito. Quindi potresti aver bisogno di usare il pragma del formato clang ora.
allenlinli

27

Per sopprimere un avviso per un singolo file, procedi come segue:

seleziona il file nel progetto xcode. premi ottieni info vai alla pagina con le opzioni di build inserisci -Wno- per negare un avviso:

-Wno-

per esempio

-Wno-inutilizzato parametri

Puoi ottenere il nome dell'avviso se guardi le impostazioni del progetto guarda gli avvisi di GCC situati nella parte inferiore della pagina della scheda build, facendo clic su ogni avviso ti dirà il nome del parametro di avviso:

per esempio

Avvisa ogni volta che un parametro di funzione è inutilizzato a parte la sua dichiarazione. [GCC_WARN_UNUSED_PARAMETER, -Wunused-parameter]


2
Questa è una soluzione eccellente per quando hai incluso codice da una base di codice che non vuoi modificare che accade per attivare gli avvisi del compilatore ...
Mark Beaton

Sembra un ottimo modo, ma qualche idea su come farlo in XCode 4
Santthosh

2
Trovato la mia soluzione qui per XCode 4 stackoverflow.com/questions/6057192/...
Santthosh

se hai bisogno di un avviso di soppressione per un solo problema, come il mio: ...m:45:69: Incompatible pointer types sending...ho aperto la spiegazione della build e [-Wincompatible-pointer-types]ho trovato questo avviso: l' ho appena rinominato -Wno-incompatible-pointer-typese aggiunto come flag al mio .mfile ... boom non più avvisi ... +10 se ho potuto
Nicos Karalis

5

Con Objective-C, una serie di errori gravi vengono visualizzati solo come avvertenze. Non solo non disabilito mai gli avvisi, ma normalmente attivo "Considera gli avvisi come errori" (-Werror).

Ogni tipo di avvertenza nel codice può essere evitato facendo le cose correttamente (normalmente eseguendo il casting di oggetti nel tipo corretto) o dichiarando prototipi quando ne hai bisogno.


14
Sebbene questo sia un buon consiglio generale, non risponde alla domanda. Non tutti gli avvisi sono critici o gravi; molti sono abbastanza banali. Si supponga di dover utilizzare una libreria di terze parti e di non poterla modificare, per qualsiasi motivo (base di codice legacy, codice destinato a essere collegato da terze parti, clausola del capo, ecc.) La soppressione di avvertimenti banali specifici è abbastanza accettabile in questi casi.
Paul Legato

5

Per eliminare l'avviso: prova a creare un'interfaccia di categoria per l'oggetto in questione

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

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

Per inciso, sconsiglio vivamente di chiamare metodi non documentati nel codice di spedizione. L'interfaccia può cambiare e cambierà, e sarà colpa tua.


Anch'io lo faccio. Chiamo la mia categoria "Privata" e la metto all'inizio del file .m ... Serve come un modo per inoltrare la dichiarazione dei metodi che vengono utilizzati solo all'interno del file. Sono d'accordo che un file di intestazione privato sarebbe più standard, ma dover costantemente rimbalzare tra i file per qualcosa che in realtà dovrebbe essere interamente contenuto (privato) per l'implementazione è fastidioso.
Pat Niemeyer

Quindi, si scopre che puoi usare il vecchio trucco C di implementare il metodo prima che qualsiasi cosa lo usi. Quindi ti sei procurato un metodo locale di file. Penso che non sia privato, quindi altri file potrebbero eventualmente inviare un messaggio al selettore che definisci in questo modo.
Mark Pauley


3

Crea un nuovo file di intestazione separato chiamato "Undocumented.h" e aggiungilo al tuo progetto. Quindi creare un blocco di interfaccia per ogni classe su cui si desidera chiamare funzioni non documentate e assegnare a ciascuna una categoria di "(Non documentato)". Quindi includi semplicemente quel file di intestazione nel tuo PCH. In questo modo i tuoi file di intestazione originali rimangono puliti, c'è solo un altro file da mantenere e puoi commentare una riga nel tuo PCH per riattivare nuovamente tutti gli avvisi.

Utilizzo questo metodo anche per le funzioni ammortizzate in "Ammortizzato.h" con una categoria "(Ammortizzato)".

la parte migliore è che puoi abilitare / disabilitare selettivamente i singoli avvisi commentando o rimuovendo il commento dai singoli prototipi.


1

Sopprimere quel particolare avvertimento non è sicuro. Il compilatore deve conoscere i tipi degli argomenti e ritorna a un metodo per generare il codice corretto.

Ad esempio, se stai chiamando un metodo come questo

[foo doSomethingWithFloat: 1.0];

che richiede un float e non è visibile alcun prototipo, quindi il compilatore supporrà che il metodo accetta un double, non un float. Ciò può causare arresti anomali e valori interpretati in modo errato. Nell'esempio sopra, su una piccola macchina endian come le macchine Intel, il metodo del ricevitore vedrebbe 0 passato, non 1.

Puoi leggere il motivo nei documenti ABI di i386 , oppure puoi semplicemente correggere i tuoi avvisi. :-)


2
Buon consiglio, ma in realtà non risponde alla domanda, come sopra.
Paul Legato
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.