gpt4 book ai didi

c++ - 使用 libclang/libtooling

转载 作者:太空宇宙 更新时间:2023-11-04 01:30:36 54 4
gpt4 key购买 nike

我必须检索项目中定义的所有结构和类型(如我之前的问题“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) 如何获取类型和结构成员?

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

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 派生类 (http://clang.llvm.org/doxygen/classclang_1_1RecursiveASTVisitor.html) 中的什么方法被调用并按什么顺序调用? (你能给我解释一下如何检索我需要的数据吗?)

最佳答案

好吧,正如 Mat Petersson 所建议的那样,我进行了实验。

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

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

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 来处理结构和 VisitFieldDecl 来获取字段。

关于c++ - 使用 libclang/libtooling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23207497/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com