使用Clang AST打印函数的参数
Print arguments of a function using Clang AST
我想获得传递给函数的参数。例如,如果我有呼叫
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
请帮我把论据拿出来。
你的答案是非常有用的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
您正在调用E->getArg(i)->getType(),但这是参数类型。使用E->getArg(i)来获取表示参数值的Expr*。然后使用printPretty(…)方法将其漂亮地打印到字符串中,如果您需要字符串值的话。
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类