【问题标题】:Print arguments of a function using Clang AST使用 Clang AST 打印函数的参数
【发布时间】:2012-03-25 08:34:13
【问题描述】:

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

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

请帮助我获取论据。

【问题讨论】:

    标签: c++ llvm clang abstract-syntax-tree format-string


    【解决方案1】:

    你的回答对马丁斯很有帮助。我不知道 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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 嗨马丁斯,你的回答对马丁斯很有帮助。我不知道 printPretty(...) 函数。现在,我可以打印参数了。谢谢。
      猜你喜欢
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 2016-10-21
      • 2015-03-02
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      相关资源
      最近更新 更多