抛出 (空) 无法识别

Throw(NULL) unrecognized

本文关键字:识别 抛出      更新时间:2023-10-16

在C++程序中,除了NULLnullnullptr之外,是否有其他词,因为throw(NULL)返回错误:

../../test.cpp:6:9:错误:使用未声明的标识符"NULL":throw(NULL);

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

另一方面,从

c++11 开始,nullptr 是一个关键字,不需要标头。由于您使用的是C++,因此首选 nullptr,这是一个关键字,并且键入。


如何使用投掷
避免抛出NULLnullptr,而更喜欢抛出派生自 std::exception 的类的对象。

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

但真正的问题是:你愿意吗? 异常由以下人员捕获类型,并且未指定NULL的类型。 它必须是一个整体类型,但它可以是任何整数类型;在实践中,我只见过intlong,但所有其他都是可能的。 那你打算怎么做抓住了?

如果这是你的代码,扔掉你捕获的任何内容。

下面是一个 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;
}

虽然你应该能够抛出(NULLnullnullptr)中的任何一个,但你可能会问自己你想完成什么。 NULL 通常解析为定义为 0 的整数。 这会导致偶尔的混淆和意外的结果,这正是 c++11 中出现 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