C++ 使用libclang/libtooling
我必须检索项目中定义的所有结构和类型,如前一个问题所述 我选择了叮当声解决方案,因为这似乎是我唯一的方法。。。 然而,我发现的唯一好的教程是:还有一些问题: 1是否处理预处理器指令,包括、定义等 2如何检索类型和结构成员 实际上,对于这个简单的代码,例如:C++ 使用libclang/libtooling,c++,c,abstract-syntax-tree,libclang,C++,C,Abstract Syntax Tree,Libclang,我必须检索项目中定义的所有结构和类型,如前一个问题所述 我选择了叮当声解决方案,因为这似乎是我唯一的方法。。。 然而,我发现的唯一好的教程是:还有一些问题: 1是否处理预处理器指令,包括、定义等 2如何检索类型和结构成员 实际上,对于这个简单的代码,例如: typedef struct { int i; char i2; } S1; typedef struct S2 { int i; struct S2 s2; } S2; typedef S3 struct S3
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派生类中的哪个方法,并按其顺序调用?你能给我解释一下如何检索我需要的数据吗?好的,正如马特·彼得森所建议的,我进行了实验 1是的,AST是在预处理器之后生成的。它允许检索所有信息 2 AST遍历是深度优先的。您可以重新实现TraverseFooo*方法以获得每个节点查找的开始和结束,而不是实现VisitFooo*方法:
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
}
}
然后要获取structs=记录及其成员,只需重新实现TraverseRecordDecl来处理struct,并访问FieldDecl来获取字段。好的,正如Mat Peterson所建议的,我进行了实验 1是的,AST是在预处理器之后生成的。它允许检索所有信息 2 AST遍历是深度优先的。您可以重新实现TraverseFooo*方法以获得每个节点查找的开始和结束,而不是实现VisitFooo*方法:
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
}
}
然后,要获取structs=记录及其成员,只需重新实现TraverseRecordDecl来处理struct,并访问FieldDecl来获取字段。当然,您的两个问题都可以通过一些实验来回答。链接中的详细描述似乎很好地解释了发生的情况。如果你不理解抽象语法树是如何工作的,那么也许你应该仔细阅读这个主题。当然,你的两个问题都可以通过一些实验来回答。链接中的详细描述似乎很好地解释了发生的情况。如果您不理解抽象语法树是如何工作的,那么也许您应该仔细阅读这个主题。