在 Clang 中生成默认构造函数

Generate the default constructor in Clang

本文关键字:默认 构造函数 Clang      更新时间:2023-10-16

>我正在尝试使用插件从 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>

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

基于这篇文章和 C++11,

当使用

odr 使用 (3.2) 创建其类类型 (1.8) 的对象时,或者在第一次声明后显式默认时,将隐式定义默认且未定义为已删除的默认构造函数。

因此,当P x在代码中时,有一个 CXXConstructorDecl 节点,即对象x是用其类类型创建的P