10

我想将参数传递给函数。例如,如果我有电话

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

输出应该是

%d%d

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

请帮助我获得论据。

4

2 回答 2

13

你的回答对马丁很有帮助。我不知道 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
于 2012-03-09T18:36:13.767 回答
10

您正在调用 E->getArg(i)->getType() - 但这是参数的类型。使用 E->getArg(i) 获取表示参数值的 Expr*。然后使用printPretty(...)方法将其漂亮地打印到字符串,如果您需要字符串值。

于 2012-03-07T20:58:33.550 回答