如何获取clang::Expr的类型字符串?Clang版本适配疑问
获取Clang 6.0.1中clang::Expr的类型字符串
你遇到的问题确实是Clang版本差异导致的接口变更:在Clang 9.0.0中,clang::Expr::getType()返回QualType,但在6.0.1里它返回的是const clang::Type*,而getAsString()是QualType的成员方法,所以直接调用会报错。
针对Clang 6.0.1,有两种可靠的方式获取表达式的类型字符串:
方法1:使用Expr的getTypeAsQualType()方法
Clang 6.0.1的Expr类提供了getTypeAsQualType()方法,直接返回包含类型限定符(如const、volatile)的QualType对象,之后就可以调用getAsString()得到类型字符串:
// 获取二元运算符左侧表达式,忽略括号和类型转换 const clang::Expr *lhs = binop->getLHS()->IgnoreParenCasts(); // 获取QualType对象 clang::QualType qualType = lhs->getTypeAsQualType(); // 转换为类型字符串 std::string typeLhs = qualType.getAsString();
如果表达式的底层类型是int,这段代码会返回字符串"int"。
方法2:手动将Type包装为QualType
如果因为某些原因无法使用getTypeAsQualType(),可以手动将Type*包装成QualType(注意如果类型有额外限定符,需要正确传递限定符信息,无限定符时第二个参数传0即可):
const clang::Expr *lhs = binop->getLHS()->IgnoreParenCasts(); const clang::Type *type = lhs->getType(); // 包装为QualType,0表示无额外限定符 clang::QualType qualType(type, 0); std::string typeLhs = qualType.getAsString();
额外说明
如果你需要更灵活的类型打印(比如控制打印格式),可以借助clang::ASTContext的printType()方法,将类型输出到字符串流中:
// 假设你已经持有ASTContext的引用(通常在ASTVisitor或ASTConsumer中可以获取) clang::ASTContext &ctx = ...; const clang::Expr *lhs = binop->getLHS()->IgnoreParenCasts(); clang::QualType qualType = lhs->getTypeAsQualType(); std::stringstream ss; ctx.printType(ss, qualType); std::string typeLhs = ss.str();
这种方式适合需要自定义类型输出格式的场景,默认情况下也会返回"int"当底层类型为int时。
内容的提问来源于stack exchange,提问作者Galaxy
相关产品推荐
相关产品推荐

