如何使用clang LibTooling获取函数指针参数名称?

3

假设我要分析这样的一段代码:

struct Foo
{
    void(*setParam)(const char* name, int value);
};

我使用clang LibTooling并在setParam上获取FieldDecl

我发现可以这样获取参数类型:

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

但是我该如何获取参数名称?(在这种情况下为“name”和“value”)这是否可能或者我需要手动查看源代码(使用SourceManager)?
1个回答

1

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

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

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;
};

然后调用的站点是:
bool VisitFieldDecl(Decl *d) {
    if (!d->getFunctionType()) {
        // not a function pointer
        return true;
    }
    ParmVisitor pv;
    pv.TraverseDecl(d);
    auto names = std::move(pv.names);

    // now you get the parameter names...

    return true;
}

请注意 getFunctionScopeDepth() 部分,这是必要的,因为函数参数本身可能是一个函数指针,例如:

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

getFunctionScopeDepth() 为0确保此参数不在嵌套上下文中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接