Gibt es eine Möglichkeit, Warnungen in Xcode zu unterdrücken?

119

Gibt es eine Möglichkeit, Warnungen in Xcode zu unterdrücken?

Zum Beispiel rufe ich eine undokumentierte Methode auf und da sich die Methode nicht im Header befindet, wird beim Kompilieren eine Warnung angezeigt. Ich weiß, dass ich es meinem Header hinzufügen kann, um die Warnung zu stoppen, aber ich frage mich, ob es eine andere Möglichkeit gibt, als es dem Header hinzuzufügen (damit ich die Header sauber und standardmäßig halten kann), um die Warnung zu unterdrücken. Ein Pragma oder so?

kdbdallas
quelle
Ja, manchmal müssen Sie dem Compiler sagen, dass er Sie nicht vor einer nicht verwendeten Variablen warnen soll (laut ihm), aber tatsächlich verwenden Sie sie möglicherweise alsBOOL ok = [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&d interval:NULL forDate:self]; NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);
thesummersign

Antworten:

144

Um Warnungen pro Datei zu deaktivieren, können Sie mit Xcode 3 und llvm-gcc-4.2 Folgendes verwenden:

#pragma GCC diagnostic ignored "-Wwarning-flag"

Wobei der Warnname ein gcc-Warnflag ist.

Dies überschreibt alle Warnflags in der Befehlszeile. Es funktioniert jedoch nicht mit allen Warnungen. Fügen Sie Ihrer CFLAGS die Option -fdiagnostics-show-hinzu, und Sie können sehen, mit welchem ​​Flag Sie diese Warnung deaktivieren können.

Robottobor
quelle
Vielen Dank ! Genau das, was ich brauchte!
Moszi
28
Einfacher Weg, um den Warncode zu erhalten: Gehen Sie zum Protokollnavigator (Befehl + 7), wählen Sie den obersten Build aus, erweitern Sie das Protokoll (die Schaltfläche '=' rechts) und scrollen Sie nach unten.
Neal Ehardt
1
Für diejenigen, die sich interessieren, eine pädagogische Referenz der GCC- Warnoptionen
Levi
2
Es scheint #pragma GCC diagnostic ignored "-Wwarning-flag"bereits entfernt zu sein
Allenlinli
1
@allenlinli es ist immer noch da, Sie müssen nur durch warning-flageine der Warnungen ersetzen, die in gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Fonix
49

Es gibt eine einfachere Möglichkeit, nicht verwendete Variablenwarnungen zu unterdrücken :

#pragma unused(varname)

BEARBEITEN: Quelle: http://www.cocoadev.com/index.pl?XCodePragmas

UPDATE: Ich bin auf eine neue Lösung gestoßen, eine robustere

  1. Öffnen Sie die Registerkarte Projekt> Aktives Ziel bearbeiten> Erstellen.
  2. Unter User-Defined: Finden (oder erstellen, wenn Sie keinen finden) den Schlüssel: GCC_WARN_UNUSED_VARIABLESetzen Sie ihn auf NO.

EDIT-2 Beispiel:

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

Der Compiler zeigt eine Warnung für nicht verwendete Variablen für an ok.

Lösung:

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

PS: Sie können auch gesetzt / zurückgesetzt andere Warnung: GCC_WARN_ABOUT_RETURN_TYPE:YES/NO

das Sommerzeichen
quelle
31
Noch einfacher ist es, __unused vor die Variablendeklaration zu setzen.
Mark Leonard
@ mark-leonard hätte eine separate Antwort sein sollen, ich habe seit Tagen danach gesucht. Ich musste aus Verzweiflung anfangen, Kommentare zu lesen. Danke dir.
Ruhe
35

Für gcc können Sie verwenden

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

Sie können hier mehr über das GCC-Pragma erfahren. Um den Warncode einer Warnung zu erhalten, rufen Sie den Berichtsnavigator (Befehl + 9) auf, wählen Sie den obersten Build aus, erweitern Sie das Protokoll (die Schaltfläche '=' rechts) und scrollen Sie zu unten und dort befindet sich Ihr Warncode in solchen eckigen Klammern[-Wshadow-ivar]

Für Clang können Sie verwenden

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop
Inder Kumar Rathore
quelle
4
Clang unterstützt das Pragma von GCC hinsichtlich der Kompatibilität mit vorhandenem Quellcode. Sie müssen also nur das Pragma im gcc-Format schreiben.
Allen
1
Ab Xcode 5.0 war Clang der einzige bereitgestellte Compiler. Daher müssen Sie jetzt möglicherweise das Pragma im Clang-Format verwenden.
Allenlinli
27

Gehen Sie wie folgt vor, um eine Warnung für eine einzelne Datei zu unterdrücken:

Wählen Sie die Datei im xcode-Projekt aus. Drücken Sie get info, um zur Seite mit den Build-Optionen zu gelangen. Geben Sie -Wno- ein, um eine Warnung zu negieren:

-Wno-

z.B

-Wno-unused-parameter

Sie können den Namen der Warnung abrufen, wenn Sie sich die Projekteinstellungen ansehen. Sehen Sie sich die GCC-Warnungen unten auf der Registerkarte "Erstellen" an. Wenn Sie auf jede Warnung klicken, wird der Name des Warnparameters angezeigt:

z.B

Warnen, wenn ein Funktionsparameter außer seiner Deklaration nicht verwendet wird. [GCC_WARN_UNUSED_PARAMETER, -Wunused-Parameter]

AndersK
quelle
2
Dies ist eine hervorragende Lösung, wenn Sie Code aus einer Codebasis eingefügt haben, die Sie nicht ändern möchten und die Compiler-Warnungen auslöst ...
Mark Beaton
Scheint eine großartige Möglichkeit zu sein, aber alle Ideen, wie Sie dies in XCode 4
Santthosh
2
Ich habe hier meine Lösung für XCode 4 stackoverflow.com/questions/6057192/… gefunden
Santthosh
Wenn Sie eine Unterdrückungswarnung für nur ein Problem benötigen, wie meine: ...m:45:69: Incompatible pointer types sending...Ich habe die Build-Erklärung geöffnet und finde diese Warnung: [-Wincompatible-pointer-types]Ich habe sie einfach umbenannt -Wno-incompatible-pointer-typesund als Flag zu meiner .mDatei hinzugefügt ... Boom keine weiteren Warnungen ... +10 wenn Ich könnte
Nicos Karalis
5

Bei Objective-C werden einige schwerwiegende Fehler nur als Warnungen angezeigt. Ich deaktiviere nicht nur niemals Warnungen, sondern aktiviere normalerweise "Warnungen als Fehler behandeln" (-Fehler).

Jede Art von Warnung in Ihrem Code kann vermieden werden, indem Sie die Dinge korrekt ausführen (normalerweise indem Sie Objekte in den richtigen Typ umwandeln) oder wenn Sie Prototypen deklarieren, wenn Sie sie benötigen.

Matt Gallagher
quelle
14
Dies ist zwar ein guter allgemeiner Rat, beantwortet aber die Frage nicht. Nicht alle Warnungen sind kritisch oder schwerwiegend. viele sind ziemlich trivial. Angenommen, man muss eine Bibliothek eines Drittanbieters verwenden und kann sie aus irgendeinem Grund nicht ändern (Legacy-Codebasis, Code, der von einem Dritten verknüpft werden soll, Vorgabe des Chefs usw.). Das Unterdrücken bestimmter trivialer Warnungen ist in diesen Fällen durchaus akzeptabel.
Paul Legato
5

So entfernen Sie die Warnung: Erstellen Sie eine Kategorieschnittstelle für das betreffende Objekt

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

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

Abgesehen davon rate ich dringend davon ab , undokumentierte Methoden im Versandcode aufzurufen. Die Schnittstelle kann und wird sich ändern, und es wird Ihre Schuld sein.

Mark Pauley
quelle
Ich mache das auch. Ich nenne meine Kategorie "Privat" und setze sie oben in die .m-Datei ... Sie dient dazu, die Methoden, die nur in der Datei verwendet werden, weiter zu deklarieren. Ich bin damit einverstanden, dass eine private Header-Datei mehr Standard wäre, aber es ist ärgerlich, ständig zwischen Dateien wechseln zu müssen, um etwas zu finden, das für die Implementierung wirklich vollständig (privat) enthalten sein sollte.
Pat Niemeyer
Es stellt sich also heraus, dass Sie den alten C-Trick verwenden können, indem Sie die Methode nur implementieren, bevor irgendetwas sie verwendet. Dann haben Sie eine dateilokale Methode. Ich denke, dass es nicht privat ist, so dass andere Dateien möglicherweise eine Nachricht an den Selektor senden könnten, den Sie auf diese Weise definieren.
Mark Pauley
3

Erstellen Sie eine neue, separate Header-Datei mit dem Namen "Undocumented.h" und fügen Sie sie Ihrem Projekt hinzu. Erstellen Sie dann einen Schnittstellenblock für jede Klasse, für die Sie undokumentierte Funktionen aufrufen möchten, und geben Sie jeder eine Kategorie von '(undokumentiert)'. Fügen Sie dann einfach diese eine Header-Datei in Ihren PCH ein. Auf diese Weise bleiben Ihre ursprünglichen Header-Dateien sauber, es muss nur eine weitere Datei verwaltet werden, und Sie können eine Zeile in Ihrem PCH auskommentieren, um alle Warnungen wieder zu aktivieren.

Ich verwende diese Methode auch für abgeschriebene Funktionen in 'Depreciated.h' mit der Kategorie '(Depreciated)'.

Das Beste daran ist, dass Sie einzelne Warnungen selektiv aktivieren / deaktivieren können, indem Sie die einzelnen Prototypen kommentieren oder auskommentieren.

Mark A. Donohoe
quelle
1

Das Unterdrücken dieser bestimmten Warnung ist nicht sicher. Der Compiler muss die Typen der Argumente kennen und kehrt zu einer Methode zurück, um korrekten Code zu generieren.

Zum Beispiel, wenn Sie eine solche Methode aufrufen

[foo doSomethingWithFloat: 1.0];

Wenn ein Float erforderlich ist und kein Prototyp sichtbar ist, vermutet der Compiler, dass die Methode ein Double und kein Float verwendet. Dies kann zu Abstürzen und falsch interpretierten Werten führen. Im obigen Beispiel würde auf einer kleinen Endian-Maschine wie den Intel-Maschinen die Empfängermethode 0 übergeben sehen, nicht 1.

Sie können in den i386 ABI-Dokumenten nachlesen, warum , oder Sie können einfach Ihre Warnungen korrigieren. :-)

Ken
quelle
2
Guter Rat, beantwortet aber die Frage nicht wie oben beschrieben.
Paul Legato