抛出 (空) 无法识别
Throw(NULL) unrecognized
在C++程序中,除了NULL
、null
或nullptr
之外,是否有其他词,因为throw(NULL)
返回错误:
../../test.cpp:6:9:错误:使用未声明的标识符"NULL":
throw(NULL);
如何使用 NULL
NULL 实际上不是核心 C 或 C++ 语言的一部分。它的定义是cstddef
或stddef.h
。
c++11 开始,nullptr
是一个关键字,不需要标头。由于您使用的是C++,因此首选 nullptr,这是一个关键字,并且键入。
如何使用投掷
避免抛出NULL
或nullptr
,而更喜欢抛出派生自 std::exception 的类的对象。
NULL
是一个宏,以stddef.h
或cstddef
定义;你必须包括这些文件之一以获取它。
但真正的问题是:你愿意吗? 异常由以下人员捕获类型,并且未指定NULL
的类型。 它必须是一个整体类型,但它可以是任何整数类型;在实践中,我只见过int
和long
,但所有其他都是可能的。 那你打算怎么做抓住了?
如果这是你的代码,扔掉你捕获的任何内容。
下面是一个 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
、nullptr
)中的任何一个,但你可能会问自己你想完成什么。 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
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 从构造函数抛出异常时如何克服内存泄漏
- GCC对可能有效的代码抛出init list生存期警告
- 如何在文件和行号中抛出错误
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 如何通过参数抛出错误消息
- 函数如何通知用户它基于函数原型抛出异常?
- 为什么 boost::interprocess::managed_shared_memory 在施工时会抛出 boost
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 有没有办法让编译器在我放置字符串而不是 nlohmann::json 对象时抛出错误?
- 编译器错误:destuctor 的更宽松的抛出说明符
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- CMake 识别 MSVC(C 和 CXX),但仍抛出"未找到 CMAKE_*_COMPILER"
- 抛出 (空) 无法识别
- 识别终止中抛出的c++异常
- 如何识别抛出的特定异常