使用Clang AST打印函数参数

10

我希望获取传递给函数的参数。例如,如果我有以下调用:

printf("%d%d", i, j);

输出应该是:

%d%d
i
j

我能够使用RecursiveASTVisitor中的VisitCallExpr()访问函数调用。我还能获取参数的数量和类型,但我不知道如何获取这些参数。

bool MyRecursiveASTVisitor::VisitCallExpr (clang::CallExpr *E)  
{
    for(int i=0, j=E->getNumArgs(); i<j; i++)
    {
        llvm::errs() << "argType: " << E->getArg(i)->getType().getAsString() << "\n";
    }
    return true;
}

输出:

argType: char *
argType: int
argType: int

请帮我获取参数。

2个回答

13

你的回答非常有帮助,Martins。我不知道printPretty(...)函数,现在我能够打印参数了。以下是我的代码以打印参数。

bool MyRecursiveASTVisitor::VisitCallExpr (clang::CallExpr *E)
{
    clang::LangOptions LangOpts;
    LangOpts.CPlusPlus = true;
    clang::PrintingPolicy Policy(LangOpts);

    for(int i=0, j=E->getNumArgs(); i<j; i++)
    {
        std::string TypeS;
        llvm::raw_string_ostream s(TypeS);
        E->getArg(i)->printPretty(s, 0, Policy);
        llvm::errs() << "arg: " << s.str() << "\n";
    }
    return true;
}

输出结果如下:

"%d%d"
i
j

10
你正在调用 E->getArg(i)->getType() - 但那是参数的类型。使用 E->getArg(i) 获取表示参数值的 Expr*。然后,如果需要字符串值,请使用 printPretty(...) 方法将其漂亮地打印成字符串。请注意保留 HTML 标签。

嗨Martins,你的回答非常有帮助。我不知道printPretty(...)函数。现在,我能够打印参数了。谢谢。 - Srikanth Vaindam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接