c++ - 移植的 C header 中的 NULL 与 nullptr

标签 c++ c++11 null coding-style standards

我正在使用 std::getenv在我的代码中调用,我不确定这三个选择 -

const char *env_p = std::getenv("SOME_ENV");

if(env_p == NULL){
    std::cout << "NULL caught";
}

if(env_p == 0){
    std::cout << "0 caught";
}

if(env_p == nullptr){
    std::cout <<"nullptr caught";
}

我应该使用其中的哪一个?我更倾向于 nullptr 版本,因为 c++ 推荐它,但由于 cstdlib 最初是一个 c 头文件,我不确定是否检查 NULL0nullptr

我运行了一个程序来检查,所有三个都被捕获了,因为没有一个具有上述名称的环境变量。所以这让我可以选择使用它们中的任何一个,甚至 if(!env_p) 对吗?

但我不太确定,因为这可能仅适用于此示例或依赖于机器或我可能缺少的东西。那么有人可以确认这个案例吗?

谢谢

最佳答案

在您的情况下,它们都是一样的。空指针是一个具有魔法值的指针,不会匹配任何指向实际数据的指针。通常,我们将其视为地址 0,大多数实现实际上使用地址 0 来表示空指针,但这是一个实现细节。

if (env_p == 0)

此文字 0 正在与指针进行比较,因此编译器会将其转换为指针。转换为指针的文字零会导致空指针,因为标准是这样规定的。

if (env_p == NULL)

这实际上是同一件事,因为在几乎所有实现中,NULL 是定义为 0 的宏。 (有一段时间,C 将 NULL 定义为 (void*)0 并不少见,但由于此处不重要的原因,这种做法不再流行。 )

if (env_p == nullptr)

nullptr 是一个 C++ 关键字,它为您提供具有特殊类型的空指针。但它仍然只是一个空指针,所以它完全符合您的要求。

在 C++ 中有一些情况(比如完美转发),你必须使用 nullptr 而不是 NULL0 来保证你有一个空指针(而不是恰好为 0 的 int)以确保类型推导选择写入模板实例化或重载。

最后,检查指针的常用习语是:

if (env_p) { ... } // true if not a null pointer
if (!env_p) { ... } // true if a null pointer

之所以可行,是因为存在不等式与 0 的隐式比较。也就是说,它们的处理方式与您编写的完全一样:

if ((env_p) != 0) { ... }
if ((!env_p) != 0) { ... }

因此,由于上述原因,它起作用了。

在 C++ 中,我使用 nullptr 作为空指针。在 C 或可能以任一模式编译的代码中,我通常使用 NULL,因为它比使用 0 的意图更清晰。

关于c++ - 移植的 C header 中的 NULL 与 nullptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36225148/

相关文章:

c# - Ogre3D:相对于自定义中心点的旋转

c++ - 与 GCC 配合使用的适用于 Windows 7 的免费 C/C++ IDE

c++ - c++ std::bind 返回值如何分配给 std::function?

c++ - 制作纯虚函数 noexcept 的好的或坏的做法

c++ - 继承和复制构造函数——如何从基类初始化私有(private)字段?

c++ - GPKG 未被识别为受支持的文件格式

c++ - 执行时 : Issue with never ending loop

java - 我从 : Object selectedValue = jPane. getValue(); 只得到 null (jPane = 新 JOptionPane(...)

android - .equals(null) 可能不是预期的

java - 为什么我的 Spring @Autowired 字段为空?