抛出(NULL)无法识别

Throw(NULL) unrecognized

在C++程序中,是否有除NULLnullnullptr以外的词,因为throw(NULL)returns错误:

../../test.cpp:6:9: error: use of undeclared identifier 'NULL' : throw(NULL);

如果这是您的代码,请抛出您要抓到的任何东西。

这是一个示例,int 0,来自 http://www.cplusplus.com/doc/tutorial/exceptions/

int main () {
  try
  {
    throw 20;
  }
  catch (int e)
  {
    cout << "An exception occurred. Exception Nr. " << e << '\n';
  }
  return 0;
}

如何使用NULL
NULL 实际上不是核心 C 或 C++ 语言的一部分。它在 cstddefstddef.h.

中定义

另一方面,从 开始,nullptr 是关键字,不需要 header。由于您使用的是 C++,因此更喜欢 nullptr,它是一个关键字,并且是类型化的。


如何使用抛出
避免抛出 NULLnullptr,而更喜欢抛出从 std::exception.

派生的 class 的 object

NULL是宏,定义在stddef.hcstddef;你必须 包含这些文件之一以获取它。

但真正的问题是:你想要吗?异常被捕获 类型,并且未指定 NULL 的类型。它必须是一个整体 类型,但它可以是任何整数类型;实际上,我只见过 intlong,但所有其他的都是可能的。那你打算怎么办 抓住了吗?

虽然您应该能够抛出 (NULLnullnullptr) 中的任何一个,但您可能会问自己要完成什么。 NULL 通常解析为定义为 0 的整数。这偶尔会导致混淆和意外结果,这正是 中出现 nullptr 关键字的原因。它是表示不会与整数混淆的空指针的独特类型。

如果您尝试抛出和捕获整数,throw( 0 );。如果你试图抛出并捕获空指针,void* p = nullptr; throw( p );.

关键字 nullptr 无需包含即可工作。 NULL,在我的 linux 框中,在 stddef.h 中定义。

此示例代码片段可能说明:

try {
    throw( NULL );
}
catch( long e ) {
    cout << "caught long " << e << endl;
}


try {
    void* p = nullptr;
    throw( p );
}
catch( long e ) {
    cout << "caught long " << e << endl;
}
catch( void* p ) {
    cout << "caught ptr" << endl;
}
catch( ... ) {
    cout << "caught unk" << endl;
}

输出为:
caught long 0 caught ptr