抛出(NULL)无法识别

时间:2015-01-21 13:40:58

标签: c++ null clang

在C ++程序中,除了NULLnullnullptr之外还有另一个词,因为throw(NULL)会返回错误:

  

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

4 个答案:

答案 0 :(得分:2)

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

另一方面,以后,nullptr是一个关键字,并不需要标题。由于您使用的是C ++,因此首选的是nullptr,它是一个关键字,并且是键入的。


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

答案 1 :(得分:1)

NULL是一个宏,在stddef.hcstddef中定义;你必须 包含其中一个文件来获取它。

但真正的问题是:你想要吗?例外被抓住了 类型,并且未指定NULL的类型。它必须是一个整体 类型,但它可以是任何整数类型;在实践中,我只看到intlong,但所有其他人都是可能的。那你怎么样 抓住它?

答案 2 :(得分:0)

如果这是你的代码,扔掉你正在捕捉的任何东西。

以下是来自http://www.cplusplus.com/doc/tutorial/exceptions/

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

答案 3 :(得分:0)

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

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

关键字nullptr不需要包括工作。我的linux盒子上的NULL在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