【发布时间】:2019-01-03 21:23:22
【问题描述】:
我正在尝试使用插件从 Clang 中提取 AST,并且我想获取默认构造函数的“源代码”。例如,在我的源代码中,我有:
class T { public: T() = default; }
在 Clang AST 中,构造函数对象的 getBody() 成员返回 null。有没有办法将默认实现作为Stmt?在这种情况下,它将返回 {},但在一般情况下,它会涉及调用父构造函数等。
一个简单的例子,在一个文件中写入以下内容:
class P { }
int main() {
// P x;
return 0;
}
此文件不会生成任何构造函数代码(您可以使用 (clang++ -Xclang -ast-dump -fsyntax-only test-ctor.cpp) 转储 AST,但如果取消注释 P x 行,则相同的命令将生成默认构造函数:
| CXXConstructorDecl 0x562bdb879eb0 <line:5:5, col:17> col:5 used P 'void () noexcept' default trivial
| `-CompoundStmt 0x562bdb87a570 <col:17>
谢谢!
【问题讨论】:
-
AST只代表你的cpp文件的来源,构造函数代码是由编译器的后续阶段生成的,生成的构造函数的源代码不存在
-
我正在查看 -ast-dump 的结果。如果我有一个简单的
class P { };,那么转储不包含任何构造函数代码,但是一旦我编写了一个简单的int main() { P x; return 0; },clang 就会为隐式构造函数生成 AST 节点(它们甚至具有指向打开类的 {。模板实例化实际上也是如此。AST 包括模板声明,以及提到的所有特化。