如何在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
相关产品推荐
相关产品推荐

