解决方法
更好的方法是使用AST匹配器.
您基本上可以查找AST匹配器中的所有callExpr节点并绑定它们,同时绑定相应的调用方(CXXRecordDecl)节点以及不同的字符串.
您基本上可以查找AST匹配器中的所有callExpr节点并绑定它们,同时绑定相应的调用方(CXXRecordDecl)节点以及不同的字符串.
例如:
CallBackFunc callBackFunc; Matchers.addMatcher(callExpr(isExpansionInMainFile(),callee(),hasAncestor(recordDecl().bind("caller"))).bind("callee"),&callBackFunc);
然后在callBack函数中,您可以检索这些callee和caller函数,如下所示:
class CallBackFunc : public MatchFinder::MatchCallBack { public: virtual void run(const MatcherFinder::MatchResult &Results) { auto callee = Results.Nodes.getNodeAs<clang::CallExpr>("callee"); auto caller = Results.Nodes.getNodeAs<clang::CXXRecordDecl>("caller"); // Do what is required with callee and caller. } };
(如果需要,我可以提供更多信息)