我需要预处理一些 C++ 文件以自动插入用于测试和分析的代码,我需要使用 clang API 来完成。
现在,我希望能够执行以下操作: 如果有函数:
int SomeFn(int a, int b, int c) {
doStuff();
}
我想预处理它,它看起来像这样:
int SomeFn(int a, int b, int c) {
cout << "SomeFn is invoked with the following arguments: a=" << a << ", b=" << b << ", c=" << c << endl;
doStuff();
}
我尝试扩展 ASTConsumer
并使用方法 HandleTopLevelDecl
和 HandleTopLevelSingleDecl
并检查传递的 Decls
是 FunctionDecls
并将它们向下转换,这样我就可以得到它们的名称和正文位置。
但是我不能那样处理类方法,只能处理全局函数。
我在 ASTConsumer
类 HandleTagDeclDefinition(TagDecl* D)
中找到了一个函数。文档说:
This callback is invoked each time a TagDecl (e.g. struct, union, enum, class) is completed.
但是当我测试它时,它看起来甚至没有被调用。
所以我的问题是,执行此任务的正确方法是什么? C++ 类在 clang API 中是如何表示的?也许有人知道,我在哪里可以找到示例,因为 clang API 的文档很少。
更新:
我知道还有 Visitors
的概念,还有一个方法 VisitRecordDecl(RecordDecl *D)
。文档说 RecordDecl
代表类。所以我扩展了 RecursiveASTVisitor
并实现了 VisitRecordDecl(RecordDecl *D)
但看起来,这个方法也没有被调用。
相反,当找到类定义时调用 VisitVarDecl
,就好像它被视为变量声明一样。
所以我有点困惑。我希望,有人可以帮助...
更新 2:
我试图解析另一个文件,这次 clang 找到了一个 RecordDecl
。但是文件定义了一个结构和两个类,所以我认为我的 clang 代码解析的是 C 而不是 C++。是否有任何设置可以在 C 和 C++ 之间切换?
最佳答案
Are there any settings to switch between C and C++ ?
最后我找到了如何处理这个问题:
我从 ASTConsumer
扩展而来和 RecursiveASTVisitor<MyConsumer>
遍历 AST 并实现 VisitCXXRecordDecl(CXXRecordDecl* D)
.然后我必须设置 LangOptions
预处理器的参数,因此它解析 C++。
langOpts.CPlusPlus = 1;
我的错误是认为它会立即解析 C++,但事实并非如此,它默认解析 C,因此不识别类。
关于c++ - 使用 clang API 处理 C++ 函数以插入代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6602967/