clang-8:从 AST 中的 DeclRefExpr 节点获取 typedef 信息

clang-8: getting typedef information from DeclRefExpr node in AST

我有以下测试代码:

typedef void (*funcPtrType)()
funcPtrType FPT;

void myFunc(){
    
}

int main(){
    FPT = myFunc;
    FPT();
    return 0;
}

以下是此代码的 AST 转储部分:

我的问题是,我可以从哪个 API 获取 DeclRefExpr 节点的 'void (*)()' 信息?

已经尝试将此节点动态转换为 VarDecl,但无法从中获取我提到的信息。

提前致谢。

如果你有一个 DeclRefExpr, that is an expression that refers to a declared entity. Call the getDecl method to get the associated ValueDecl, which is the declaration itself. On that object, call getType to get the QualType,这是类型,可能包括 cv-qualifiers。

例如:

DeclRefExpr const *dre = ...;      // wherever you got it
ValueDecl const *decl = dre->getDecl();
QualType type = decl->getType();

在这种情况下,类型是 typedef。要检查基础类型,请调用 getTypePtr 获取非限定类型,然后调用 getUnqualifiedDesugaredType 跳过类型定义:

clang::Type const *underType = type.getTypePtr()->getUnqualifiedDesugaredType();

然后可以调用,比如underType->isPointerType(),判断是否是指针类型等。其他查询方式见clang::Type的文档

如果你想得到 underType 的字符串表示,使用静态 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";

对于您的示例,这将打印:

type as string: "void (*)()"