更好的方法是使用AST匹配器.
您基本上可以查找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<:callexpr>("callee");
auto caller = Results.Nodes.getNodeAs<:cxxrecorddecl>("caller");
// Do what is required with callee and caller.
}
};
(如果需要,我可以提供更多信息)