首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >clang-8:从AST中的DeclRefExpr节点获取类型定义信息

clang-8:从AST中的DeclRefExpr节点获取类型定义信息
EN

Stack Overflow用户
提问于 2020-11-18 14:13:56
回答 1查看 76关注 0票数 0

我有以下测试代码:

代码语言:javascript
复制
typedef void (*funcPtrType)()
funcPtrType FPT;

void myFunc(){
    
}

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

下面是代码的AST转储部分:

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

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

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-18 19:26:24

如果你有一个DeclRefExpr,那就是一个引用声明实体的表达式。调用getDecl方法以获取关联的ValueDecl,它是声明本身。在该对象上,调用getType以获取QualType,这是类型,可能包括cv限定符。

例如:

代码语言:javascript
复制
DeclRefExpr const *dre = ...;      // wherever you got it
ValueDecl const *decl = dre->getDecl();
QualType type = decl->getType();

在本例中,类型为typedef。要检查底层类型,请调用getTypePtr获取未限定的类型,然后调用getUnqualifiedDesugaredType跳过typedefs:

代码语言:javascript
复制
clang::Type const *underType = type.getTypePtr()->getUnqualifiedDesugaredType();

例如,您可以调用underType->isPointerType()来确定它是否是指针类型,等等。有关查询它的其他方法,请参阅clang::Type的文档。

如果希望获得underType的字符串表示形式,请使用静态QualType::print方法,如下所示:

代码语言:javascript
复制
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";

对于您的示例,将打印以下内容:

代码语言:javascript
复制
type as string: "void (*)()"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64887984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档