You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在LLVM Clang 14中从FunctionDecl对象获取带参数的全限定函数名

获取Clang FunctionDecl的完整函数签名(clang/llvm-14.0.0)

getQualifiedNameAsString()仅能返回函数的限定名(如Foo::foo),要生成包含返回类型和参数列表的完整签名,需要手动拼接三部分内容:返回类型字符串、函数限定名、参数列表字符串。

实现代码示例

#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
#include "clang/AST/Type.h"
#include "llvm/Support/raw_ostream.h"
#include <string>

std::string getFullFunctionSignature(clang::FunctionDecl *FD) {
    if (!FD) return "";
    
    clang::ASTContext &Ctx = FD->getASTContext();
    const clang::PrintingPolicy &PrintPolicy = Ctx.getPrintingPolicy();

    // 1. 获取返回类型字符串
    std::string retTypeStr = FD->getReturnType().getAsString(PrintPolicy);

    // 2. 获取函数限定名
    std::string qualifiedName = FD->getQualifiedNameAsString();

    // 3. 获取参数列表字符串
    std::string paramsStr;
    llvm::raw_string_ostream paramsStream(paramsStr);
    clang::FunctionType::printParams(
        FD->getType()->castAs<clang::FunctionType>(),
        paramsStream,
        PrintPolicy,
        /* IncludeDefaultArgs */ false,
        FD
    );

    // 拼接完整签名
    return retTypeStr + " " + qualifiedName + "(" + paramsStr + ")";
}

补充:添加CV/引用限定符

如果需要包含函数的const/volatile或引用(&/&&)限定符,可以在拼接时加入以下逻辑:

// 生成CV及引用限定符字符串
std::string cvRefQualifiers;
if (FD->isConst()) cvRefQualifiers += " const";
if (FD->isVolatile()) cvRefQualifiers += " volatile";
if (FD->isLValueReference()) cvRefQualifiers += " &";
else if (FD->isRValueReference()) cvRefQualifiers += " &&";

// 修改最终拼接逻辑
return retTypeStr + " " + qualifiedName + "(" + paramsStr + ")" + cvRefQualifiers;

效果验证

对于你提供的示例代码,调用getFullFunctionSignature(FD)会返回目标字符串:int Foo::foo(int)。

内容的提问来源于stack exchange,提问作者milkpotato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:37:45