CXXRecordDecl和子VarDecl?

时间:2019-03-28 01:12:36

标签: clang abstract-syntax-tree

比方说,我有一个CXXRecordDecl,它只有静态成员,都被提升为外部链接:

struct S {
  static constexpr int x = 10;
  static constexpr int y = 20;
  static void foo() {...}
};

AST如下:

TranslatioUnitDecl 
...
CXXRecordDecl struct S definition
 -CXXRecordDecl implicit struct S
 -VarDecl x
   -IntegralLiteral 10
 -VarDecl y
   -IntegralLiteral 20
 -CXXMethodDecl foo
  ...

我认为由于“静态”数据成员,所以CXXRecordDecl中没有FieldDecl,而是有2个VarDecl。那么如何从CXXRecordDecl访问2 VarDecl?为此,CXXRecordDecl中没有API函数。

我能想到的唯一方法是使用RecursiveASTVisitor类并访问所有decl。 VarDecl具有布尔API函数isStaticDataMember()和isConstexpr()来帮助您,太好了!但是我怎么知道这些静态VarDecl的父类是什么?

任何建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

我想我找到了自己的答案。对于许多块decl(包括RecordDecl),都有一个基类DeclContext。此类具有公共成员函数,以迭代结构中的所有decl,请参阅decls_begin()和decls_end()。