C++ 如何从带有叮当声的TagDecl中获取结构成员
我有一个AST消费者,它得到了所有的TagDecl,这些TagDecl都是用C++ 如何从带有叮当声的TagDecl中获取结构成员,c++,c,clang,clang++,llvm-clang,C++,C,Clang,Clang++,Llvm Clang,我有一个AST消费者,它得到了所有的TagDecl,这些TagDecl都是用 clang::TagDecl::isStruct() 如何在类似FunctionDecl类的数组中获取结构(声明、类型)的成员: clang::FunctionDecl::getParamDecl(unsigned i) 或者以任何其他方式?必须将TagDecl强制转换为具有获取成员/字段信息方法的RecordDecl clang::TagDecl*t; clang::RecordDecl*r; clang::Re
clang::TagDecl::isStruct()
如何在类似FunctionDecl类的数组中获取结构(声明、类型)的成员:
clang::FunctionDecl::getParamDecl(unsigned i)
或者以任何其他方式?必须将
TagDecl
强制转换为具有获取成员/字段信息方法的RecordDecl
clang::TagDecl*t;
clang::RecordDecl*r;
clang::RecordDecl::field_iterator jt;
for(jt = r->field_begin(); jt != r->field_end();++jt)
{
std::cout << jt->getType().getAsString() << " " << jt->getNameAsString() << std::endl;
}
clang::TagDecl*t;
铿锵::RecordDecl*r;
clang::RecordDecl::field_迭代器jt;
对于(jt=r->field_begin();jt!=r->field_end();++jt)
{
std::cout getType().getAsString()void HandleTagDeclDefinition(TagDecl*D)重写
{
如果(D->isStruct())
{
DeclContext*DC=静态(D);
对于(DeclContext::decl\u迭代器DI=DC->decls\u begin(),DEnd=DC->decls\u end();
DI!=DEnd;++DI)
{
DI->dump();
}
}
}
您应该将此函数添加到扩展到ASTConsumer的类中。
在该上下文中存储声明
每个声明上下文可以包含一定数量的声明
例如,C++类(由RealDeCl表示)包含各种
成员函数、字段、嵌套类型等等
声明将存储在DeclContext中,您可以
通过[DeclContext::decls_begin()迭代声明,
DeclContext::decls_end())。此机制提供以源代码为中心的
上下文中声明的视图
请尽量避免将代码作为答案,并尝试解释它的作用和原因。对于没有相关编码经验的人来说,您的代码可能不明显。
void HandleTagDeclDefinition(TagDecl *D) override
{
if(D->isStruct())
{
DeclContext *DC = static_cast<DeclContext *>(D);
for (DeclContext::decl_iterator DI = DC->decls_begin(), DEnd = DC->decls_end();
DI != DEnd; ++DI)
{
DI->dump();
}
}
}