我正在尝试使用libtooling构建工具。 当使用clang来转储AST时,我发现为Foo类报告了两个CXXRecordDecl。 似乎外部CXXRecordDecl有一个CXXRecordDecl子级,它表示它是隐式类Foo。 为什么会这样?
答案 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.
这不是前向声明,可能是编译定义的隐式构造函数。