Wie werden typisierte Konstanten mit "unused variable" Warnungen verwendet?

8

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.

    
Kenny Wyland 18.02.2013, 23:34
quelle

6 Antworten

15

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

%Vor%

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.

    
dreamlax 18.02.2013, 23:50
quelle
12
Mit

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.

    
Josh Caswell 18.02.2013 23:40
quelle
4

Machen Sie Ihre Konstanten const :

%Vor%

(und wie andere darauf hingewiesen haben, verwenden Sie extern und definieren Sie in der Implementierungsdatei)

    
Sebastian 18.02.2013 23:45
quelle
2

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.

    
Sebivor 18.02.2013 23:51
quelle
1

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%     
Tom 03.09.2014 11:10
quelle
0

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.

    
Ankit Malhotra 21.05.2013 23:35
quelle

Tags und Links