clang-8:从AST中的DeclRefExpr节点获取typedef信息
我有以下测试代码:clang-8:从AST中的DeclRefExpr节点获取typedef信息,clang,abstract-syntax-tree,clang-static-analyzer,Clang,Abstract Syntax Tree,Clang Static Analyzer,我有以下测试代码: typedef void (*funcPtrType)() funcPtrType FPT; void myFunc(){ } int main(){ FPT = myFunc; FPT(); return 0; } 以下是该代码的AST转储部分: 我的问题是,我可以从哪个API从DeclRefExpr节点获取“void(*)()”信息 已经尝试将此节点动态强制转换为VarDecl,但从中我无法获得我提到的信息 提前感谢。如果您有,
typedef void (*funcPtrType)()
funcPtrType FPT;
void myFunc(){
}
int main(){
FPT = myFunc;
FPT();
return 0;
}
以下是该代码的AST转储部分:
我的问题是,我可以从哪个API从DeclRefExpr节点获取“void(*)()”信息
已经尝试将此节点动态强制转换为VarDecl,但从中我无法获得我提到的信息
提前感谢。如果您有,这是一个引用已声明实体的表达式。调用getDecl
方法来获取相关的声明本身。在该对象上,调用getType
以获取类型,该类型可能包括cv限定符
例如:
DeclRefExpr const *dre = ...; // wherever you got it
ValueDecl const *decl = dre->getDecl();
QualType type = decl->getType();
在这种情况下,类型为typedef
。要检查基础类型,请调用getTypePtr
以获取非限定类型,然后调用getunqualifiededeguedtype
以跳过typedefs:
clang::Type const *underType = type.getTypePtr()->getUnqualifiedDesugaredType();
然后,您可以调用,例如,underType->isPointerType()
,以确定它是否是指针类型,等等。有关查询它的其他方法,请参阅文档
如果要获取类型下的字符串表示形式
,请使用静态QualType::print
方法,如下所示:
LangOptions lo;
PrintingPolicy pp(lo);
std::string s;
llvm::raw_string_ostream rso(s);
QualType::print(underType, Qualifiers(), rso, lo, llvm::Twine());
errs() << "type as string: \"" << rso.str() << "\"\n";
谢谢您的解释,但我真正的问题是,在我发现underType->isPointerType()为true之后,如何找到指针声明?正如在问题中一样,我需要“void(*)()信息作为字符串。好的,我添加了关于如何获取该类型的字符串表示的信息。非常感谢,这是我正在查找的信息。
type as string: "void (*)()"