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 (*)()"