C++ 如何使用clanglibtooling获取函数指针参数名称?

C++ 如何使用clanglibtooling获取函数指针参数名称?,c++,clang,llvm,libtooling,C++,Clang,Llvm,Libtooling,假设我分析这样的代码: struct Foo { void(*setParam)(const char* name, int value); }; 我使用clanglibtooling并在setParam上获取FieldDecl 我想我可以得到这样的参数类型: auto ft = fieldDecl->getFunctionType()->getAs<FunctionProtoType>(); for (size_t i = 0; i < fpt->

假设我分析这样的代码:

struct Foo
{
    void(*setParam)(const char* name, int value);
};
我使用clanglibtooling并在
setParam
上获取
FieldDecl

我想我可以得到这样的参数类型:

auto ft = fieldDecl->getFunctionType()->getAs<FunctionProtoType>();
for (size_t i = 0; i < fpt->getNumParams(); i++)
{
    QualType paramType = fpt->getParamType(i);
    ....
}
auto-ft=fieldDecl->getFunctionType()->getAs();
对于(大小i=0;igetNumParams();i++)
{
QualType paramType=fpt->getParamType(i);
....
}

但是我如何得到参数名呢?(“在这种情况下为“name”和“value”)这是可能的,还是我需要手动查看源代码(使用
SourceManager
)?

我认为不可能直接从类型获取参数名,因为它们不是类型信息的一部分

但您的任务可以通过再次访问函数指针声明来完成:

class ParmVisitor
    : public RecursiveASTVisitor<ParmVisitor>
{
public:
    bool VisitParmVarDecl(ParmVarDecl *d) {
        if (d->getFunctionScopeDepth() != 0) return true;

        names.push_back(d->getName().str());
        return true;
    }

    std::vector<std::string> names;
};
请注意
getFunctionScopeDepth()
部分,这是必要的,因为函数参数可能是函数指针本身,类似于:

void(*setParam)(const char* name, int value, void(*evil)(int evil_name, int evil_value));
getFunctionScopeDepth()
为0可确保此参数不在嵌套上下文中

void(*setParam)(const char* name, int value, void(*evil)(int evil_name, int evil_value));