从clang中的FunctionDecl类获取参数信息

时间:2014-06-23 10:29:46

标签: c++ clang libtooling

如何从clang中的FunctionDecl类获取参数信息作为字符串。我尝试但是被这么多的遗产弄糊涂了。他们编译器也说getReturnType()不是FunctionDecl的成员,但是doxygen文档说不然。请帮忙。 http://clang.llvm.org/doxygen/classclang_1_1FunctionDecl.html

using namespace std;
using namespace clang;
using namespace clang::driver;
using namespace clang::tooling;
using namespace llvm;

.......
class ExampleVisitor : public RecursiveASTVisitor<ExampleVisitor> 
{
    ......
    virtual bool VisitFunctionDecl(FunctionDecl *func) 
    {
            numFunctions++;
            string funcName = func->getNameInfo().getName().getAsString();
            string retName = func->getReturnType().getAsString();
            ...
            return true;
    }

}

错误: -

  

'class clang :: FunctionDecl'没有名为'getReturnType'的成员

4 个答案:

答案 0 :(得分:3)

根据您是否需要合格或非限定名称,您可以将返回类型和参数名称字符串化,如下所示

std::string retType = F->getReturnType().getAsString();
std::string arg0;
if(F->getNumParams() > 0)
  arg0 = F->parameters()[0]->getQualifiedNameAsString();

查看提供的getAsString()方法。


编辑:在您发表评论后,我发现您没有最新的Clang源代码。请在重试前检查一下。祝你好运!

答案 1 :(得分:2)

试试这个,

getResultType() 

而不是

getReturnType()

llvm 3.4没有成员getReturnType()但存在名称为getResultType()的相同功能。

答案 2 :(得分:0)

要动态获取所有参数列表,下面的代码会有所帮助。

string retName = func->getReturnType().getAsString();
for(int i=0; i<func->getNumParams(); i++)
{
    std::cout << " " << func->parameters()[i]->getQualifiedNameAsString();
}
...     

答案 3 :(得分:0)

这是一个工作功能,可以打印有关FunctionDecl的所有信息。已在Windows / LLVM6.0.0上进行了测试

void printFunctionDecl(FunctionDecl* f) 
{
    std::cout << "FunctionDecl@:"<<f<<":"
        << f->getReturnType().getAsString()<<" "
        << f->getQualifiedNameAsString()
        <<"(";

    for (int i = 0; i < f->getNumParams(); i++)
    {
        if (i > 0) std::cout << ",";             
        std::cout 
            << QualType::getAsString(f->parameters()[i]->getType().split()
                , PrintingPolicy{ {} })<<" "
            << f->parameters()[i]->getQualifiedNameAsString();          
    }

    std::cout << ")"
        <<"   Definition@"<<f->getDefinition()
        <<"\n";
}