有没有一种方法可以使用 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"
例如,我得到了以下代码。
#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"