Entschuldigung für die ausführliche Frage, aber ich kann keine andere Möglichkeit sehen, das klarzustellen. Ich schreibe ein Werkzeug, um C ++ - Header-Dateien in SWIG-Interface-Dateien als Starter für die weitere Feinabstimmung zu transformieren.
Im Zuge dessen habe ich ein merkwürdiges Verhalten von clang (v3.0) bemerkt. Wenn ich die Headerdatei analysiere, erhalte ich einen erheblich anderen AST als wenn ich eine Quelldatei analysiere, die den Header enthält.
Zum Zwecke der Veranschaulichung hier einige Beispielquelldateien:
Quelldatei:
%Vor%Kopfzeile:
%Vor%Ich habe den folgenden Python-Code verwendet, um ihn zu parsen und den AST auszugeben:
%Vor%Wenn ich das auf example.cpp ausführe bekomme ich (richtigerweise denke ich):
%Vor% Aber wenn ich es zusammen mit python nsbug.py example.py
in der Header-Datei versuche, bekomme ich nur:
Warum ist der Geom
Namensraum im AST als VAR_DECL? Ich hätte keinen Unterschied erwartet, außer in den Präprozessor-Cursors.
Die Umgehung ist offensichtlich - machen Sie einfach eine temporäre Datei im Speicher, die den Header enthält - aber das ist nicht sehr befriedigend. Kann mich jemand aufklären?
Da Sie keine Sprache explizit angeben, bestimmt Clang die Sprache aus der Dateierweiterung, was dazu führt, dass "example.h"
als C, nicht C ++ geparst wird. Daher ist die Datei weitgehend fehlerhaft, und der Indexer versucht, so gut wie möglich wiederherzustellen. namespace Geom
wird als Variablendeklaration für Geom
mit einem unbekannten Typ namespace
behandelt, und der folgende unerwartete {
... }
-Block wird übersprungen.
Versuchen:
%Vor%Während Richards Antwort in diesem Fall funktioniert, kann ich über das gleiche Problem hinweg und das hat bei mir nicht funktioniert. Es stellte sich heraus, dass die Python Clang Bindings die Fehlermeldung versteckten. Wenn Sie Folgendes ausführen:
%Vor% Dies wird die AST-Information ausdrucken. In meinem Fall konnte die Header-Datei nicht gefunden werden, da sie sich in einem anderen Verzeichnis befand. Also, ich musste -I
und den zusätzlichen Include-Pfad zu% code_de% hinzufügen und es hat funktioniert.