在Clang中如何确定访问的CXXRecordDecl是类、结构体还是联合体

7
我使用 Clang 来从 C++ 源代码构建AST,并使用 RecursiveASTVisitor 遍历树。
我想在访问记录声明时确定它是类、结构体还是联合体。我有一个重载的函数 VisitCXXRecordDecl(clang::CXXRecordDecl)。在这个函数中,我可以 检查类提供的任何关于 CXXRecordDecl 的信息,但我不知道如何获取这些信息。
有人可以帮我吗?
2个回答

13

只需使用 isStructisClassisUnion 成员函数,或调用 getTagKind 函数获取一个 TagKind 值,如果您喜欢也可以使用 switch。它们位于 TagDecl 基类中。


2

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

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

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


1
从标准9.5.2中可以看出:“联合体可以拥有成员函数(包括构造函数和析构函数),但不能拥有虚函数(10.3)。”我已经测试了上述代码,它可以正常工作。 - Bill Weinman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接