有没有一种方法可以使用 Clang API 扩展宏来获取源代码

is there a way to get source code with macro expanded using Clang API

例如,我得到了以下代码。

#define ADD(x, y) (x) + (y) 

int func(int i, int j) 
{ 
   return ADD(i, j); 
} 

clang SourceManager 可用于获取函数func 的源代码。而我得到的是 { return ADD(i, j)。有什么方法可以让我获得源代码 { return (i) + (j); } ?

keyboardsmoke 的回答:已测试

可以简单地使用Decl::print()方法,或者这个答案中keyboardsmoke的代码,实际上,Decl::print()调用了DeclPrinter的方法。

Stmt 有一个名为 printPretty() 的不同方法,它可以打印出扩展了宏的语句的源代码。

一个简单的方法是使用Decl里面的'print'函数,漂亮的打印机会展开所有的宏。

您还可以打印语句,因此如果您想要返回特定的语句,您应该能够执行类似的操作。

Decl::print 也指的是 "DeclPrinter",它允许您打印任何 decl 类型(输出到 raw_ostream)

std::string s;
llvm::raw_string_ostream sos(s);
PrintingPolicy pp(compiler->getLangOpts());
pp.adjustForCPlusPlus();
DeclPrinter DP(sos, pp, 0 /* indent */, true /* PrintInstantiation */);
DP.Visit(functionDecl);

会将 "functionDecl" 的文本放入 "std::string s"