c++ - 为什么在 C++ 中使用了 NULL?

标签 c++

C++ 标准将空指针定义为0。然而,在很多代码中,我看到使用了 NULL 宏。

为什么会这样?如果标准将 NULL 定义为 0,为什么要为其使用特殊常量?

这只是一种审美选择,还是有更实际的原因?或者过去是否存在不再有效的原因,即旧版 C++ 标准草案的遗留问题?

如何以及为何开始使用 NULL 而不是 0

最佳答案

这是 C 的遗留问题,其中 NULL 通常定义为 (void*)0。在 C 中,由于转换规则,它使 NULL 可隐式转换为任何其他指针类型,同时保持不可转换为整数类型:

int* a = NULL; /* OK */
int b = NULL;  /* ERROR */

C++ 然而没有这种松散的类型转换,因此 NULL 在 C++ 中被定义为 0。虽然这意味着 int b = NULL; 是合法的,但编译器通常足够聪明,可以在您这样做时发出警告,因为它们认识到 NULL 是一个特殊的宏,从而保留一些类型安全......当警告起作用时。

当然,在 C++11 中,应该使用 nullptr 来代替。在 C++03 中甚至 Stroustrup已经推荐使用 0 而不是宏。

关于c++ - 为什么在 C++ 中使用了 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22932360/

相关文章:

c++ - 统计c++文本文件每一行的字数

c++ - CA2W 给了我一个 "' AtlThrowLastWin3 2': identifier not found"错误

c++ - boost 图 : How to copy the nodes and edges of a graph without copying properties?

c++ - 在 CameraCaptureUI 中限制 'change camera"按钮中的相机类型

c++ - 对于非常接近于零的值,双重计算运行得更慢

C++ 异常处理指南

c++ - 枚举成员与静态int成员?

c++ - 在 Qt Gui 应用程序中更改控制台应用程序的概念

c++ - 仅检查共享库中的内存问题(例如 Apache 模块)

c++ - D3D12CreateDevice 抛出 _com_error