2012-05-07 10 views
6

używam dzyń budować AST z C++ kodu źródłowego i RecursiveASTVisitor przemierzać drzewo.Zdecyduj w Clang jeśli odwiedził CXXRecordDecl jest klasa, struct lub union

Chciałbym podjąć decyzję w odwiedzonej deklaracji rekordu, jeśli jest to klasa, struktura lub związek. Mam nadpisaną funkcję VisitCXXRecordDecl (clang :: CXXRecordDecl). W tej funkcji mogę check any information about CXXRecordDecl, że klasa oferuje, ale nie mam pojęcia, jak uzyskać informacje thie.

Czy ktoś może mi pomóc?

Odpowiedz

8

Wystarczy użyć isStruct, isClass i isUnion funkcji składowych, lub zadzwoń getTagKind aby uzyskać wartość TagKind można switch na jeśli wolisz. Są w klasie bazowej TagDecl.

2

W czasie wykonywania C++ nie rozróżnia klasy i struktury, a związek jest odróżniany tylko przez fakt, że jego członkowie danych dzielą wspólną przestrzeń adresową.

Jedynym sposobem, aby to osiągnąć, jest uwzględnienie metadanych w definicjach klas/struktur/związków, które wspierają ważne dla ciebie rozróżnienia. Na przykład:

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

Czy na pewno związki zawodowe mogą mieć funkcje członka? – RedX

+1

Ze standardu: 9.5.2: "Złącze może mieć funkcje składowe (w tym konstruktory i destruktory), ale nie funkcje wirtualne (10.3)." Testowałem powyższy kod i to działa. –

Powiązane problemy