这是一个非常基本的代码示例,以及我想要的内容:
class B{
// Implementation of class B
};
class D : public B{
// Implementation of class D
};
int main(){
try{
// Code for try statement
}
catch(D & d){
// Handler for D
}
catch(B & b){
// Handler for B
}
return 0;
}
目前我能够在处理程序中获得类B和类D的CXXRecordDecl(我可以从CXXCatchStmt类中的getCaughtType方法获取它们).
我想要做的是能够从D类访问B类的CXXRecordDecl,因为我们有D类:public B.
我在类D的CXXRecordDecl上尝试了类CXXRecordDecl中可用的以下方法:
> getCanonicalDecl():返回D级
> getInstantiatedFromMemberClass():返回nullptr
> getDefinition():返回D级
我现在没有想法了.有人有想法吗?
解决方法:
以下是Joachim Pileborg在评论中给出的答案的实施.
bool VisitCXXTryStmt(CXXTryStmt * tryStmt){
int nbCatch = tryStmt->getNumHandlers();
for(int i = 0 ; i < nbCatch ; i++){
if(tryStmt->getHandler(i)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl() == nullptr){
cout << "The caught type is not a class" << endl;
}
else{
cout << "Class caught : " << tryStmt->getHandler(i)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->getNameAsString() << endl;
}
if(tryStmt->getHandler(i)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->bases_begin() == nullptr){
cout << "This class is the base class" << endl;
}
else{
cout << "Base class caught : " << tryStmt->getHandler(i)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->bases_begin()->getType().getAsString() << endl;
}
cout << "\n \n END OF LOOP \n \n" << endl;
}
return true;
}
对于问题中给出的示例,产生以下输出:
被抓住的类:D
捕获的基类:B类
循环结束
上课时间:B
这个类是基类
循环结束
标签:c,clang 来源: https://codeday.me/bug/20191009/1876327.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。