c++ - 使用 clang API 处理 C++ 函数以插入代码

标签 c++ clang

我需要预处理一些 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 并使用方法 HandleTopLevelDeclHandleTopLevelSingleDecl 并检查传递的 DeclsFunctionDecls 并将它们向下转换,这样我就可以得到它们的名称和正文位置。 但是我不能那样处理类方法,只能处理全局函数。

我在 ASTConsumerHandleTagDeclDefinition(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/

相关文章:

c++ - LLVM 无法识别 unnamed_addr

c++ - 在 C++ 中通过 const 引用返回接收函数复制值是否值得?

c++ - libcurl C++ 在 POSTing JSON 时出现段错误

c++ - 内联函数中的 undefined reference ,用一元 + 解决

ruby-on-rails - pg 1.0.0 `fatal error: ' libpq-fe.h' 文件未找到`

c++ - 没有将 bool 隐式转换为浮点类型的警告?

c++ - 修改一个伪随机数在2个值之间;

c++ - 连接多个字符

c - 如何使用 GCC/Clang 编译器了解/限制 C 程序中的静态堆栈大小?

c++ - OpenCV c++ 找不到 <opencv2/face.hpp>