如果访问过的CXXRecordDecl是类,结构或联合,则决定Clang

时间:2012-05-07 16:57:17

标签: c++ clang abstract-syntax-tree

我使用 Clang C ++ 源代码构建AST,并使用 RecursiveASTVisitor 遍历树。

如果是类,结构或联合,我想在访问的记录声明中做出决定。我有一个重写函数 VisitCXXRecordDecl(clang :: CXXRecordDecl)。在这个函数中,我可以check any information about CXXRecordDecl该类提供,但我不知道如何获取该信息。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:9)

只需使用isStructisClassisUnion成员函数,或致电getTagKind即可获得TagKindswitch如果你愿意的话。他们在TagDecl基类。

答案 1 :(得分:2)

在运行时,C ++不区分类和结构,而union只能通过其数据成员共享地址空间这一事实来区分。

因此,实现此目标的唯一方法是在类/结构/联合定义中包含元数据,以支持对您很重要的区别。例如:

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