为什么Clang有时返回nullptr,有时返回我想要的

Why does Clang returns sometimes nullptr, sometimes what I want?

本文关键字:返回 我想要 nullptr 为什么 Clang      更新时间:2023-10-16

如果你想更广泛地了解我想做的东西,这个问题间接地跟随这个问题。

因此,基本上,我想区分捕获普通类的处理程序和捕获实际上是子类的类的处理程序。

因此,使用前面提供的链接,我找到了一种方法来知道我是在处理一个简单的类还是一个子类,但是,我无法获得与我的子类相关联的基的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; 
} 

用下面的代码,我能够得到class DCXXRecordDecl:

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)。

我没有解释,但它确实像我想的那样工作,即使不知道确切原因有点困扰我:/

旧帖子,但因为我偶然发现了它,我认为我应该澄清:你混淆了getPointeeCXXRecordDeclgetAsCXXRecordDecl。前者仅用于指针和引用类型,D & dcatch中定义了这些类型。但是class D的基类(存储在您通过bases_begin()访问的CXXBaseSpecifier内部)不是指针或引用类型,它只是一个无聊的记录类型。所以这就是为什么你需要在一种情况下使用getAsCXXRecordDecl而不是其他。