Ich versuche automatisch typedefs in beliebigen C ++ - oder C Projekten aufzulösen.
Da einige der typedefs in Systemheaderdateien definiert sind (zum Beispiel uint32
), versuche ich dies zu erreichen, indem ich den gcc-Präprozessor für meine Codedateien ausführe und dann die vorverarbeiteten Dateien nach typedefs scanne. Ich sollte dann in der Lage sein, die Typedefs in den Code-Dateien des Projekts zu ersetzen.
Ich frage mich, ob es eine andere, vielleicht einfachere Art gibt, die ich vermisse. Kannst du an einen denken?
Der Grund, warum ich das machen möchte: Ich extrahiere Code-Metriken aus den C / C ++ - Projekten mit verschiedenen Werkzeugen. Die Metriken sind methodenbasiert. Nach dem Extrahieren der Metriken muss ich die Daten zusammenführen, die von den verschiedenen Tools erzeugt werden. Das Problem ist, dass eines der Tools typedefs auflöst und andere nicht. Wenn typedefs für die Parametertypen von Methoden verwendet wird, werden Metriken verschiedenen Methodennamen zugeordnet, die sich im Quellcode auf dieselbe Methode beziehen.
Stellen Sie sich diese Methode im Quellcode vor: int test(uint32 par1, int par2)
Nachdem ich meine Tools ausgeführt habe, habe ich Metriken, die einer Methode namens int test(uint32 par1, int par2)
zugeordnet sind, und einige meiner Metriken werden auf int test(unsigned int par1, int par2)
abgebildet.
Wenn Sie nicht herausfinden möchten, wo sie definiert sind, können Sie objdump
um die C ++ - Symboltabelle auszugeben, die typedefs auflöst.
Dieses Snippet stammt aus der folgenden Strukturdefinition:
%Vor% Dies erfordert, dass Sie alles kompilieren und es werden nur Symbole in der resultierenden ausführbaren Datei angezeigt, so dass einige Einschränkungen bestehen. Die andere Option besteht darin, dass der Linker eine Symbolzuordnung ablegt. Für GNU-Tools fügen Sie -Wl,-map
und -Wl,name
hinzu, wobei name
der Name der zu erzeugenden Datei ist (siehe Hinweis). Dieser Ansatz macht die Namen nicht überflüssig, aber mit ein wenig Arbeit können Sie die Mangelnde Konventionen des Compilers zurückentwickeln. Die Ausgabe des vorherigen Snippets enthält etwa Folgendes:
Sie können diese mit der C ++ ABI Spezifikation dekodieren. Sobald Sie sich daran gewöhnt haben, wie das funktioniert, wird die Mangeltabelle , die in der ABI enthalten ist, unbezahlbar . Die Herleitung ist in diesem Fall:
%Vor% Hinweis: Es sieht so aus, als ob GNU die Argumente in ld
ändert. Daher sollten Sie in Ihrem lokalen Handbuch ( man ld
) nachsehen, ob die Befehle zur Generierung der Kartendatei -map
sind. filename
in Ihrer Version. In neueren Versionen verwenden Sie -Wl,-M
und leiten stdout in eine Datei um .
Sie können Clang (das LLVM C / C ++ - Compiler-Front-End) verwenden, um Code so zu analysieren, dass Informationen zu typedefs und sogar Makros erhalten bleiben. Es hat eine sehr nette C ++ - API zum Lesen der Daten, nachdem der Quellcode in den AST (Abstract Syntax Tree) eingelesen wurde. Ссылка
Wenn Sie stattdessen nach einem einfachen Programm suchen, das bereits die Auflösung für Sie erledigt (anstelle der Clang-Programmier-API), denke ich, dass Sie Pech haben, da ich noch nie so etwas gesehen habe.
GCC-XML kann helfen, die typedefs aufzulösen, Sie müssten den Typ-IDs von folgen <Typedef>
elements, bis Sie sie in ein <FundamentalType>
, <Struct>
oder <Class>
Element aufgelöst haben.
Zum Ersetzen der typedefs in Ihrem Projekt haben Sie jedoch ein grundsätzlicheres Problem: Sie können nicht einfach suchen und ersetzen, da Sie den Geltungsbereich von Namen berücksichtigen müssen - denken Sie an z. function-local typedefs, Namespace-Aliase oder using
-Direktiven.
Je nachdem, was Sie eigentlich erreichen wollen, muss es einen besseren Weg geben.
Update: Eigentlich sollte in dem gegebenen Kontext der Korrektur von Metrikdaten die Ersetzung der Typnamen mit gcc-xml funktionieren, wenn sie Ihre Codebasis unterstützt.
Tags und Links c c++ typedef c-preprocessor