5

如何从 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”的成员</p>

4

4 回答 4

3

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

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

查看提供的getAsString()方法。


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

于 2014-06-23T10:46:11.190 回答
2

尝试这个,

getResultType() 

而不是

getReturnType()

llvm 3.4 没有成员getReturnType(),但名称相同的函数getResultType()存在。

于 2015-10-01T17:54:22.177 回答
0

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

string retName = func->getReturnType().getAsString();
for(int i=0; i<func->getNumParams(); i++)
{
    std::cout << " " << func->parameters()[i]->getQualifiedNameAsString();
}
...     
于 2015-07-10T05:18:56.117 回答
0

这是一个工作函数,用于在 Windows/LLVM6.0.0 上打印有关 FunctionDecl.Tested 的所有信息

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";
}
于 2019-03-25T13:33:16.043 回答