c++ 在Clang中生成默认构造函数

9wbgstp7  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(151)

我试图提取一个AST从Clang使用一个插件,我想得到的“源代码”的默认构造函数。
例如,在我的源代码中,我有:

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>
uajslkp6

uajslkp61#

这可以通过Sema对象使用以下函数来实现:DefineImplicitDefaultConstructorSema对象可从CompilerInstance获得。

k3bvogb1

k3bvogb12#

基于this post和C++11语言,
一个默认的且未定义为删除的构造函数,当它被odr使用(3.2)来创建一个其类类型的对象(1.8)时,或者当它在第一次声明后被显式默认时,它被隐式定义。
因此,当P x在代码中时,有一个CXXConstructorDecl节点,即对象x由其类类型P创建。

相关问题