为什么Clang有时会返回nullptr,有时我想要什么呢?

时间:2014-08-18 14:44:10

标签: c++ clang

此问题间接跟随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; 
} 

使用以下代码,我可以获得CXXRecordDecl的{​​{1}}:

class D

这很好,我可以通过bool VisitCXXTryStmt(CXXTryStmt * tryStmt){ CXXRecordDecl * child_class = tryStmt->getHandler(0)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl(); return true; } 获得CXXRecordDecl。 所以我无辜地认为这样做也可以得到基类:

QualType

但是这会返回nullptr。但是,如果我正在执行此行:

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

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

那么,为什么我可以在一个案例中使用类声明,而不是在另一个案例中?

2 个答案:

答案 0 :(得分:0)

我终于找到了一种方法来获得我想要的CXXRecordDecl

我没有合理的解释,但是:

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

我没有解释,但它确实按照我的意愿行事,即使这让我有点不知道原因:/

答案 1 :(得分:0)

旧帖子,但是由于偶然发现,我想澄清一下:您正在混用getPointeeCXXRecordDeclgetAsCXXRecordDecl。前者仅用于D & d在您的catch中定义的指针和引用类型。但是class D的基类(存储在您通过CXXBaseSpecifier访问的bases_begin()内部)不是指针或引用类型,它只是一个无聊的记录类型。这就是为什么您需要在一种情况下使用getAsCXXRecordDecl而不在另一种情况下使用的原因。