AST结构中0x671xxxx字段的含义及可调用的相关API查询
Clang AST中0x开头字段的含义
你看到的0x671xxxx格式的字段,是AST节点在当前编译进程内存中的实例指针值:
- Clang在编译时会把每一个语法结构实例化为对应C++类的对象(比如赋值操作为
BinaryOperator类对象、整数常量为IntegerLiteral类对象),这个十六进制值就是该对象在内存中的首地址 - 该值仅在当前编译任务的生命周期内有效,重新编译同一份代码生成的节点地址会发生变化
- 除了标识节点自身,部分节点末尾的地址是它引用的其他关联节点的指针,比如示例中
MemberExpr末尾的0x6711e00就是成员b对应的FieldDecl声明节点的地址
获取该字段的相关API
以下是Clang原生C++ API的对应获取方式:
- 获取当前节点自身的地址:在AST遍历回调中拿到节点指针后,直接输出指针本身的十六进制值即可,比如AST Visitor回调参数中的
BinaryOperator *Op,输出Op得到的就是AST dump中节点名后跟随的0x字段 - 获取节点关联的其他节点地址:调用节点对应的成员方法获取关联节点指针后输出即可,常见方法包括:
MemberExpr::getMemberDecl():获取成员表达式关联的字段声明节点指针DeclRefExpr::getDecl():获取声明引用表达式关联的变量/函数声明节点指针
示例代码片段
#include "clang/AST/RecursiveASTVisitor.h" #include "clang/AST/Expr.h" #include "llvm/Support/raw_ostream.h" class ASTAddressVisitor : public clang::RecursiveASTVisitor<ASTAddressVisitor> { public: bool VisitBinaryOperator(clang::BinaryOperator *Op) { if (Op->isAssignmentOp()) { llvm::outs() << "赋值操作节点地址:" << Op << "\n"; // 左值是成员表达式的情况 if (auto *ME = clang::dyn_cast<clang::MemberExpr>(Op->getLHS())) { llvm::outs() << "成员表达式节点地址:" << ME << "\n"; llvm::outs() << "关联成员声明节点地址:" << ME->getMemberDecl() << "\n"; } // 右值是整数常量的情况 if (auto *IL = clang::dyn_cast<clang::IntegerLiteral>(Op->getRHS())) { llvm::outs() << "整数常量节点地址:" << IL << "\n"; } } return true; } };
上述代码的输出结果和你贴的AST dump中的地址字段完全对应。
内容的提问来源于stack exchange,提问作者haoshuo xu
相关产品推荐
相关产品推荐

