2012-05-07 11 views
6

Ich benutze Clang eine AST von C++ Quellcode aufzubauen und RecursiveASTVisitor den Baum zu durchqueren.in Clang Entscheiden Sie, ob die besuchte CXXRecordDecl Klasse, Struktur oder Vereinigung

Ich möchte an einer besuchten Deklaration von Datensatz entscheiden, ob es sich um Klasse, Struktur oder Union handelt. Ich habe eine überschriebene Funktion VisitCXXRecordDecl (clang :: CXXRecordDecl). In dieser Funktion kann ich check any information about CXXRecordDecl, dass die Klasse bietet, aber ich habe keine Ahnung, wie Sie diese Informationen erhalten.

Kann mir jemand helfen?

Antwort

8

Verwenden Sie einfach die isStruct, isClass und isUnion Elementfunktionen oder getTagKind einen TagKind Wert zu erhalten, rufen Sie switch können, wenn Sie es vorziehen. Sie sind in der TagDecl Basisklasse.

2

Zur Laufzeit unterscheidet C++ nicht zwischen Klasse und Struktur, und Union ist nur unterscheidbar durch die Tatsache, dass seine Datenmitglieder alle Adressraum teilen.

Der einzige Weg, dies zu erreichen, wäre, Metadaten in Ihre class/struct/union-Definitionen aufzunehmen, die die für Sie wichtigen Unterscheidungen unterstützen. Zum Beispiel:

typedef enum { class_ct, struct_ct, union_ct } c_type; 

class foo { 
public: 
    c_type whattype() { return class_ct; } 
}; 

struct bar { 
public: 
    c_type whattype() { return struct_ct; } 
}; 

union baz { 
public: 
    c_type whattype() { return union_ct; } 
}; 

// B

+0

Sind Sie sicher, dass Gewerkschaften Mitgliederfunktionen haben dürfen? – RedX

+1

Aus dem Standard: 9.5.2: "Eine Union kann Memberfunktionen (einschließlich Konstruktoren und Destruktoren), aber keine virtuellen (10.3) Funktionen haben." Ich habe den obigen Code getestet und es funktioniert. –