在C ++程序中,除了NULL
,null
或nullptr
之外还有另一个词,因为throw(NULL)
会返回错误:
../../ test.cpp:6:9:错误:使用未声明的标识符' NULL' :
throw(NULL);
答案 0 :(得分:2)
如何使用NULL
NULL实际上并不是核心C或C ++语言的一部分。它在cstddef
或stddef.h
中定义。
另一方面,c++11以后,nullptr
是一个关键字,并不需要标题。由于您使用的是C ++,因此首选的是nullptr,它是一个关键字,并且是键入的。
如何使用投掷
避免抛出NULL
或nullptr
并且更喜欢抛出从std :: exception派生的类的对象。
答案 1 :(得分:1)
NULL
是一个宏,在stddef.h
或cstddef
中定义;你必须
包含其中一个文件来获取它。
但真正的问题是:你想要吗?例外被抓住了
类型,并且未指定NULL
的类型。它必须是一个整体
类型,但它可以是任何整数类型;在实践中,我只看到int
和long
,但所有其他人都是可能的。那你怎么样
抓住它?
答案 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)
虽然你应该能够抛弃任何(NULL
,null
,nullptr
),但你可能会问自己,你想要完成什么。 NULL通常解析为定义为0的整数。这会导致偶然的混淆和意外结果,这正是c++11 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