Ich verwende Xcode 4.6 und ich habe eine Header-Datei, die einige Konstanten enthält, die ich in meinem Code verwende. Ich möchte Präprozessor-Direktiven nicht verwenden, weil ich möchte, dass sie richtig eingegeben werden und so.
Zum Beispiel habe ich diesen Code in einer meiner .h-Dateien:
%Vor%und ich verwende es in der entsprechenden .m-Datei:
%Vor%Ich bekomme die Warnung:
%Vor%Ich weiß, dass es nur eine Warnung ist, aber ich habe ungefähr 50 dieser Warnungen, die meine Compilerausgabe verstopfen.
Warum bekomme ich diese Warnung und wie kann ich sie PROBLEM beheben?
Ich bin nicht daran interessiert, alle unbenutzten Variablenwarnungen einfach zu unterdrücken, weil ich die richtigen erhalten möchte.
Machen Sie die Deklaration in Ihrer Kopfzeile extern
anstatt static
. Sie erstellen eine Variable für jede Übersetzungseinheit, die Ihre Kopfzeile enthält. Aus diesem Grund warnt Clang Sie, da es sich um eine definierte Variable handelt, die nicht verwendet wird. Das Schlüsselwort extern
teilt dem Compiler mit, dass die Definition der Variablen irgendwo anders gefunden wird (sie könnte sich in derselben Übersetzungseinheit oder in einer anderen befinden).
In Ihrer Kopfzeile:
%Vor% Und in one Ihrer .m
-Dateien (normalerweise die, die denselben Namen wie die Überschrift hat), legen Sie
Das Deklarieren von Variablen extern
ermöglicht dem Compiler sicherzustellen, dass Sie die Variable korrekt behandeln, auch wenn sie nicht weiß, wo sie definiert ist (z. B. können Sie sie nicht als NSArray
verwenden). Der Linker hat die Aufgabe, sicherzustellen, dass Sie ihn irgendwo definiert haben.
Clang können Sie Warnflaggen auf und von einem "Diagnose" -Stack schieben und ablegen: " Diagnose über Pragmas steuern ". Sie können bestimmte Teile des Codes folgendermaßen umschließen:
%Vor%, um Clang mitzuteilen, dass Sie wissen, dass diese nicht verwendet werden, und das ist in diesem Fall in Ordnung.
Sie möchten diese Variablen in einer Datei, die an viele verschiedene Orte importiert wird, nicht definieren - das ist ein guter Weg, Linkerfehler bei der Variablenneudefinition zu verursachen (obwohl dies nur passieren würde, wenn Die Variable wurde global verknüpft - deklariert / definiert ohne static
. Das übliche Muster für Konstanten wie folgt ist, eine extern
Deklaration in die Kopfzeile einzufügen, und definieren die Variable in einer anderen Datei. Siehe Verweis auf einen statischen NSString * const von einer anderen Klasse für Details.
Wie dreamlax darauf hingewiesen hat, erhalten Sie diese Warnungen tatsächlich, weil jede Datei, die Ihren Header importiert, eine eigene Kopie der static
-Variable erhält; Als ich oben die #pragma
-Technik vorgeschlagen habe, habe ich falsch verstanden, wonach du gefragt hast.
Vielleicht könnten Sie, anstatt sie auf String-Literale zu initialisieren, eine Initialisierungsfunktion ausführen, die diese Werte aus einer länderspezifischen Datei lädt, so dass Fehler in einer übersetzten Sprache vorliegen. Wenn Ihre Initialisierungsfunktion dieser Variablen zugewiesen wird, könnte Ihr Compiler versucht sein zu glauben, dass die Variable existieren muss, damit die Kompilierung erfolgreich ist.
GCC (und ich vermute, klingeln) warnen nicht vor unbenutzten Konstanten. Eine Falle, auf die man achten muss, ist, dass Zeiger const-Zeiger sein müssen, nicht nur Zeiger auf const; Um eine nicht verwendete Zeichenfolgekonstante zu deklarieren, die keine Warnungen auslöst, benötigen Sie:
%Vor%Sie könnten die gesamte statische Variablendeklaration in Ihre jeweilige .m-Datei verschieben. Das sollte all diese "unbenutzten Variablen" Warnungen wegnehmen. Der Grund dafür ist, dass statische Variablen auf Dateiebene beschränkt sind.
Tags und Links c objective-c xcode