2016-08-01 38 views
0

Ich arbeite in dem Prozess, C-Code zu entfernen, der Variablen verwendete, die in einer Headerdatei deklariert wurden. Mein Compiler warnt aus irgendwelchen Gründen nicht vor unbenutzten Variablen aus der Header-Datei. Was ist die Option, um unbenutzte Variable aus einer Header-Datei aufzurufen. Es tut es aber von der C-Datei.Wie bekomme ich ungenutzte Variable Warnung aus der Header-Datei?

+1

Sie erhalten diese nicht, weil andere C-Dateien den Header enthalten und die Variablen verwenden können. Wenn Sie diese erhalten wollten, müssten Sie sie vorübergehend in eine C-Datei verschieben. – merlin2011

+4

Das Definieren einer Variablen in einer Header-Datei wird im Allgemeinen als schlechte Methode betrachtet - Sie können * deklarieren *, aber nicht * definieren *. Und wenn es dort nur * deklariert * und nicht benutzt wird, gibt es normalerweise keine Warnung vom Compiler (es tut nichts, aber es kostet nichts). Bist du sicher, dass du Variablen wirklich * definierst? Kannst du ein paar Beispiele geben? – tofro

+0

Wenn ein Compiler _all_ die Quelldateien, die 'foo.h' enthalten, nicht sehen kann, kann er nicht wissen, ob ein' foo.h' deklariertes Objekt nicht verwendet wird. Klingt wie ein Job für den Linker. – chux

Antwort

2

Erstens, der Compiler als solcher ist nicht einmal bewusst, ob eine Variable in einer Header-Datei oder in der .c-Datei deklariert wird - Nachdem der Präprozessor ausgeführt wurde, ist dies nicht zu unterscheiden.

Was Sie normalerweise in einer Header-Datei deklarieren, ist externe Referenzen, d. H. Variablen der Storage-Klasse external. Kein Compiler, den ich kenne, warnt, wenn eine solche Variable nicht verwendet wird - Viele System-Header-Dateien deklarieren solche Variablen, und Sie würden mit Warnungen überflutet werden (errno oder stderr sind beachtenswerte Beispiele) - Sie wollen nicht gewarnt werden jede Quelldatei, die nicht verwendet errno oder stderr)

Compiler können Warnungen für nicht verwendete static Variablen und nicht verwendete Funktionsparameter ausgeben. Die Verwendung und der Umfang solcher Variablen ist auf die aktuelle Kompilierungseinheit oder Funktion beschränkt und "niemand könnte sie möglicherweise verwenden", so dass es sinnvoll ist, zu warnen. extern Variablen können sehr gut von anderen Objektdateien verwendet werden, für die der Compiler keine Warnung ausgeben könnte - Ein richtiger Linker würde jedoch erkennen, dass ein externes Symbol von keiner Objektdatei verwendet wird und diese Variable automatisch aus dem Objekt entfernt letzte ausführbare Datei - Keine Warnung erforderlich, da sie vom Kompilierungssystem repariert werden kann.

0

Für C-Compiler gibt es keinen Unterschied zwischen Header (enthalten) und jeder anderen C-Source-Datei.

Der Compiler muss keine Warnmeldung über nicht verwendete globale Daten ausgeben, da diese Daten von einer anderen Software verwendet werden können.

Wenn Sie Bedenken haben, dass ein Teil der Daten nur im Bereich einer einzelnen Objektdatei verwendet wird, versuchen Sie, diese Datendefinition mit dem Schlüsselwort static vorzuziehen, und erstellen Sie die Software neu. Wenn nach einiger Zeit alles noch gut funktioniert und Sie sicher sind, dass jede mögliche (faule) dynamische Verbindung immer noch glücklich sein wird, Stück der globalen Daten zu verlieren, die Sie gerade entfernt haben - es ist wirklich 100% sicher, es zu entfernen.

+0

Ihr letzter Vorschlag ist wahrscheinlich keine gute Idee: Wenn in 15 Quelldateien dieselbe Kopfzeile mit der gleichen 'statischen' Definition (' statisch' ist * immer * eine Definition) enthalten ist, haben Sie 15 Instanzen derselben Variablen Wenn Sie es so belassen, wie es war (keine "statische"), hätte der Linker sich über mehrere Definitionen beschwert. Ihr Vorschlag ist nur in einer .c-Datei sinnvoll. – tofro

+0

Bei zweiten Gedanken, erhalten Sie eine Warnung für nicht verwendete 'statische' - So könnte es wirklich helfen, Orte zu erkennen, die diese Variable nicht verwenden. – tofro

+0

@tofro Ja, du bekommst genau richtig. Gib mir +1 :) – sqrt163