我正在使用 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/