移植的c标头

时间:2016-03-25 17:51:38

标签: 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最初是ac标题,我不确定要检查NULL0nullptr

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

但我不太确定,因为这可能仅适用于此示例或依赖于机器或我可能缺少的内容。所以任何人都可以证实这个案子?

三江源

2 个答案:

答案 0 :(得分:2)

在你的情况下,他们都是一样的。空指针是一个带有魔术值的指针,它不会匹配任何指向实际数据的指针。通常,我们将其视为地址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来保证你有一个空指针(而不是一个发生的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更清晰。

答案 1 :(得分:1)

简短回答:它们都是一样的,你可以互换使用它们。

答案稍长:

std::getenv如果失败则返回NULL指针:

  

标识环境变量值的字符串或空指针(如果找不到此类变量)。

如果要检查功能是否失败,可以使用以下任一方法:

  • if (env_p == NULL)定义为0#define NULL 0
  • if (env_p == 0)是一回事
  • if (env_p == nullptr)是一种C ++方式 - 安全(只能与指针进行比较)
  • if (!env_p)true时,
  • env_p仅为false,因此与检查env_p == 0
  • 相同

如果您使用的是现代C ++,我会坚持使用nullptr