为了解决所描述的问题,您可以例如编写一个访问DeclStmt
节点(不仅VarDecl
)的递归 AST 访问者。查看此站点以了解如何编写这样的访问者:http ://clang.llvm.org/docs/RAVFrontendAction.html
您应该访问DeclStmt
节点而不仅仅是VarDecl
节点的原因可以通过查看声明语句的 AST 表示来解释:
|-DeclStmt 0x35dbfc8 <line:3:1, col:17>
| |-VarDecl 0x35dbe48 <col:1, col:5> col:5 i 'int'
| |-VarDecl 0x35dbeb8 <col:1, col:8> col:8 j 'int'
| `-VarDecl 0x35dbf28 <col:1, col:15> col:11 k 'int' cinit
| `-IntegerLiteral 0x35dbf88 <col:15> 'int' 10
如您所见,DeclStmt
“捕获”了所有VarDecl
节点(以及初始化,如果给定)。一旦您的访问者访问,DeclStmt
您可以使用isSingleDecl()
成员函数检查您的声明是否引用单个声明。如果不是(如您的情况),您可以使用,等检索到不同VarDecl
节点的迭代器。decl_begin()
decl_end()