2012-05-07 12 views
6

Io uso Clang per costruire un AST da C++ codice sorgente e RecursiveASTVisitor per attraversare l'albero.Decidere in Clang se il CXXRecordDecl visitato è di classe, struct o unione

Vorrei decidere in una dichiarazione di registrazione visitata se si tratta di classe, struttura o unione. Ho una funzione di override VisitCXXRecordDecl (clang :: CXXRecordDecl). In questa funzione posso check any information about CXXRecordDecl offerte dalla classe, ma non ho idea di come ottenere le informazioni.

Qualcuno può aiutarmi?

risposta

8

Basta usare il isStruct, isClass, e isUnion funzioni membro, o chiamare getTagKind per ottenere un valore TagKind si può switch su, se si preferisce. Sono nella classe base TagDecl.

2

In fase di esecuzione, C++ non distingue tra classe e struttura, e l'unione è distinguibile solo dal fatto che i suoi membri di dati condividono tutti lo spazio degli indirizzi.

Quindi, l'unico modo per ottenere ciò sarebbe includere i metadati nelle definizioni di classe/struttura/unione che supportano le distinzioni che sono importanti per voi. Per esempio:

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

Sei sicuro che i sindacati possano avere funzioni membro? – RedX

+1

Dallo standard: 9.5.2: "Un sindacato può avere funzioni membro (inclusi costruttori e distruttori), ma non virtuali (10.3)." Ho testato il codice sopra e funziona. –

Problemi correlati