如果您想更广泛地了解我要制作的内容,此问题间接地跟在this question之后。

因此,基本上,我想区分捕获公共类的处理程序和捕获确实是子类的处理程序。

因此,通过前面提供的链接,我找到了一种方法来了解我是在处理简单类还是子类,但是,我无法获得与子类关联的基的CXXRecordDecl

例如,这是一段代码:

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
    }
    return 0;
}


通过以下代码,我可以得到CXXRecordDeclclass D

bool VisitCXXTryStmt(CXXTryStmt * tryStmt){
    CXXRecordDecl * child_class = tryStmt->getHandler(0)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl();
    return true;
}


这可以正常工作,我可以通过CXXRecordDecl使用QualType
所以我天真地以为这也可以得到基类:

bool VisitCXXTryStmt(CXXTryStmt * tryStmt){
    CXXRecordDecl * base_class = tryStmt->getHandler(0)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->bases_begin()->getType().getTypePtr()->getPointeeCXXRecordDecl();
    return true;
}


但这将返回nullptr。但是,如果我执行此行:

cout << tryStmt->getHandler(0)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->bases_begin()->getType().getAsString() << endl;


我有想要的输出(B类)。

那么,为什么在一种情况下可以有类声明,而在另一种情况下却没有?

最佳答案

我终于找到了获取我想要的CXXRecordDecl的方法。

我对此没有合理的解释,但:


在第一种情况下,使用方法getPointeeCXXRecordDecl返回所需的CXXRecordDecl
在第二种情况下,使用方法getAsCXXRecordDecl返回所需的CXXRecordDecl


这些语句不能互换(第一种情况下使用getAsCXXRecordDecl返回nullptr,第二种情况下使用getPointeeCXXRecordDecl也会返回nullptr

我没有任何解释,但是它确实可以按我的意愿工作,即使这让我有些烦恼,也不知道确切的原因:/

关于c++ - 为什么Clang有时会返回nullptr,有时会返回我想要的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25366057/

10-15 02:03