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 (*)()"
我有以下测试代码:
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 (*)()"