Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从带有叮当声的TagDecl中获取结构成员_C++_C_Clang_Clang++_Llvm Clang - Fatal编程技术网

C++ 如何从带有叮当声的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

我有一个AST消费者,它得到了所有的TagDecl,这些TagDecl都是用

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();
        }
    }
}