Frage

Ich verwende ein Makro in meiner Quelldatei (*.c).

Gibt es eine Möglichkeit während der Zusammenstellung oder aus der Bibliothek, dass ich die genaue Header -Datei identifizieren kann, aus der dieses bestimmte Makro gelöst wird?

Das Problem ist, dass wir in einer Header -Datei eine Makro #definierte auf 10 verwenden, aber der Wert, der im Code empfangen wird, beträgt 4. Anstatt alle DEP -Dateien zu überprüfen, möchten wir wissen, dass es eine direkte Möglichkeit gibt, die Quelle zu identifizieren, aus der das Makro gelöst wurde.

War es hilfreich?

Lösung

Wenn Sie gerade CPP (CPP (C -Präprozessor) in der Datei ausführen, enthält die Ausgabe #Line -Direktiven des Formulars

#line 45 "silly-file-with-macros.h"

Für den Compiler, woher alles kam. Eine Möglichkeit ist also zu verwenden

 cpp my-file.c | more

Und suchen Sie nach dem #line Richtlinie.

Abhängig von Ihrem Compiler kann ein weiterer Trick, den Sie verwenden können

test-eof.c:5:1: warning: "FRED" redefined
test-eof.c:3:1: warning: this is the location of the previous definition

(Dies ist von GCC), was Ihnen sagen sollte, wo das Makro zuvor definiert war. Aber denken Sie daran, wie kommt es, dass Sie diese Warnung nicht schon bekommen?

Eine andere Idee ist zu verwenden makedepend Um eine Liste aller enthaltenen Dateien zu erhalten, dann grep sie für #define Zeilen in ihnen.

Andere Tipps

Grep für die #Define?

find / -name '*.h' | xargs -L 100 grep -H macroname

Dort gibt es drei Befehle. Der Befehl zum Finden wählt aus, welche Dateien gesucht werden sollen, damit Sie dies auf 'ändern können..c 'oder'.Cpp 'oder was auch immer du brauchst. Dann spaltet der Befehl xargs die Liste der Dateien in 100 gleichzeitig, sodass Sie eine interne Shell -Befehlspuffergröße nicht überfüllen. Anschließend wird der GREP -Befehl wiederholt mit jeder Liste von 100 Dateien ausgeführt und druckt alle Dateinamen mit Macroname und der Codezeile, die ihn verwendet.

Daraus sollten Sie in der Lage sein zu sehen, wo es neu definiert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top