首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用libclang/libclang工具

使用libclang/libclang工具
EN

Stack Overflow用户
提问于 2014-04-21 23:03:05
回答 1查看 2K关注 0票数 1

我必须检索项目中定义的所有结构和类型(正如我在前面的问题"https://stackoverflow.com/questions/23154414/c-project-get-all-global-variables-and-all-types“中所描述的)。

我选择了clang解决方案,因为这似乎是我唯一的方法.然而,我发现的唯一“好”教程是这个:http://kevinaboos.wordpress.com/2013/07/23/clang-tutorial-part-i-introduction/,还有一些问题:

( 1)是否处理了预处理指令(#include、#define等)

2)如何检索类型和结构成员?

实际上,对于这个*简单的*代码,例如:

代码语言:javascript
复制
typedef struct
{
   int i;
   char i2;
} S1; 

typedef struct S2
{
   int i;
   struct S2 s2;
} S2;

typedef S3 struct S3;
struct S3
{
   int i;
   char i2;
}
S1 m_s1;
S2 m_s2;
struct S3 m_s3;

调用clang::RecursiveASTVisitor-derived类(1RecursiveASTVisitor.html)的方法是什么?(你能解释一下如何检索我需要的数据吗?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-25 07:36:58

好吧,按照马特·彼得森的建议,我做了实验。

1)是的,AST是在预处理器之后生成的。它允许检索所有的信息。

2) AST的遍历是深度优先。与其实现VisitFoo(Foo *)方法,不如重新实现TraverseFoo(Foo *)方法以获取每个节点查找的开始和结束:

代码语言:javascript
复制
class YourVisitor : public RecursiveASTVisitor<YourVisitor>
{
   //...
   virtual bool TraverseFoo(Foo * f)
   {
      //Some stuff to do before to explore the children
      bool r = RecursiveASTVisitor<YourVisitor>::TraverseFoo(f);
      //Some stuff to do after
      return r
   }
}

然后,要获取结构(=记录)及其成员,只需重新实现TraverseRecordDecl来处理struct,VisitFieldDecl就可以获得字段。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23207497

复制
相关文章

相似问题

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