我有以下测试代码:
typedef void (*funcPtrType)()
funcPtrType FPT;
void myFunc(){
}
int main(){
FPT = myFunc;
FPT();
return 0;
}下面是代码的AST转储部分:

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

我已经尝试将此节点动态转换为VarDecl,但我无法从它获得我提到的信息。
提前谢谢。
发布于 2020-11-18 19:26:24
如果你有一个DeclRefExpr,那就是一个引用声明实体的表达式。调用getDecl方法以获取关联的ValueDecl,它是声明本身。在该对象上,调用getType以获取QualType,这是类型,可能包括cv限定符。
例如:
DeclRefExpr const *dre = ...; // wherever you got it
ValueDecl const *decl = dre->getDecl();
QualType type = decl->getType();在本例中,类型为typedef。要检查底层类型,请调用getTypePtr获取未限定的类型,然后调用getUnqualifiedDesugaredType跳过typedefs:
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 (*)()"https://stackoverflow.com/questions/64887984
复制相似问题