c++ - 在 libclang 访问者中将成员函数作为参数传递

标签 c++ c++11 clang libclang

我正在使用 LibClang 在 C++ 程序中遍历 AST,如下所示:

CXChildVisitResult visitor(CXCursor cursor, CXCursor parent, CXClientData data) {
  // some code
}

int main() {
  // some code
  clang_visitChildren(rootCursor, visitor, 0);
}

如果 visitor() 是类的成员,我不知道如何将 visitor 传递给 clang_visitChildren()。我尝试使用 ClassName::visitor 而不是 visitor,但出现以下编译器错误:

error: invalid use of non-static member function ‘CXChildVisitResult ClassName::visitor(CXCursor, CXCursor, CXClientData)’

最佳答案

clang_visitChildren 只接受常规函数,不接受成员函数。它为了使用一个成员函数,你必须创建一个辅助静态成员函数,它将调用一个非静态成员函数:

class MyVisitor
{
public:
  CXChildVisitResult visitor(CXCursor, CXCursor);
  static CXChildVisitResult visitorHelper(CXCursor cursor, CXCursor parent, CXClientData client_data) {
    return static_cast<MyVisitor *>(client_data)->visitor(cursor, parent);
  }
};

int main() {
  MyVisitor myVisitor;
  // some code
  clang_visitChildren(rootCursor, &MyVisitor::visitorHelper, &myVisitor);
}

请注意使用 client_data 参数将指针传递给您要调用其方法的对象。这是 C API 中非常常见的回调模式。

或者,您可能希望选择不同的库来使用 Clang(更多信息 here),例如 LibTooling它提供了一个 C++ 接口(interface)。

关于c++ - 在 libclang 访问者中将成员函数作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52859032/

相关文章:

c++ - 在 C++ 中全局声明的动态数组的多个定义

c++ - 如何从 systeminfo.exe 显示的区域设置字符串中检索 "Human Readable"字符串?

c++ - 如何在本地生成像干净组装一样的godbolt?

在 C 中检查对 _Generic() 选择的支持

c++ - 传递用于结构定义的参数

c++ - 在标准 (C++11) 的哪个地方说余数运算符仅适用于整数类型?

c++ - 在 C++ 中实现进度可视化

c++ - 为什么 "A<0>=0"中的模板 ID 由于大于或等于运算符 ">="而不能在没有空格的情况下编译?

clang:有没有办法指定 c11 原子操作中使用的低级指令?

C++字符数组不显示地址