为什么c AST为单个类显示两个CXXRecordDecl?

时间:2019-03-10 14:36:13

标签: clang abstract-syntax-tree libtooling

我正在尝试使用libtooling构建工具。 当使用clang来转储AST时,我发现为Foo类报告了两个CXXRecordDecl。 似乎外部CXXRecordDecl有一个CXXRecordDecl子级,它表示它是隐式类Foo。 为什么会这样?

Definition

AST Dump

2 个答案:

答案 0 :(得分:0)

这只是一个类声明。

在您的示例中,您会注意到这两个 CXXRecordDecl 具有不同的位置,并且嵌套的一个对应于 Foo 的前向声明。没有前向声明,定义将指向自身。

答案 1 :(得分:0)

至少,要知道如何将另一个匹配是很有用的:

// test.cpp
class Foo {};
int main() { return 0; }

使用ast匹配器

clang-query> m cxxRecordDecl(hasName("Foo"))
Match #1:
test.cpp:2:1: note: "root" binds here
class Foo {
^~~~~~~~~~~
Match #2:
test.cpp:2:1: note: "root" binds here
class Foo {
^~~~~~~~~
2 matches.

clang-query> m cxxRecordDecl(hasName("Foo"),unless(isImplicit()))
Match #1:
test.cpp:2:1: note: "root" binds here
class Foo {
^~~~~~~~~~~
1 match.

这不是前向声明,可能是编译定义的隐式构造函数。