2012-05-07 10 views
6

utilizo Clang para construir un AST de C++ código fuente y RecursiveASTVisitor a recorrer el árbol.Decidir en Clang si el CXXRecordDecl visitada es clase, estructura o unión

Me gustaría decidir en una declaración de registro visitada si es clase, estructura o unión. Tengo una función anulada VisitCXXRecordDecl (clang :: CXXRecordDecl). En esta función puedo check any information about CXXRecordDecl que la clase ofrece, pero no tengo idea de cómo obtener esta información.

¿Alguien me puede ayudar?

Respuesta

8

sólo tiene que utilizar los isStruct, isClass, y isUnion funciones miembro, o llame al getTagKind para obtener un valor TagKind puede switch sobre si lo prefiere. Están en la clase base TagDecl.

2

En tiempo de ejecución, C++ no hace distinción entre clase y estructura, y la unión solo se distingue por el hecho de que todos sus miembros de datos comparten espacio de direcciones.

Por lo tanto, la única forma de lograr esto sería incluir los metadatos en las definiciones de clase/estructura/unión que respaldan las distinciones que son importantes para usted. Por ejemplo:

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

¿Está seguro de que los sindicatos pueden tener funciones de miembro? – RedX

+1

Del estándar: 9.5.2: "Una unión puede tener funciones miembro (incluidos constructores y destructores), pero no funciones virtuales (10.3)". He probado el código anterior y funciona. –

Cuestiones relacionadas