我在我的代码中使用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标题,我不确定要检查NULL
或0
或nullptr
。
我运行了一个程序来检查并且所有三个都被捕获了,因为没有一个带有以上名称的env变量。所以这让我可以选择使用其中任何一个甚至是if(!env_p)
对吗?
但我不太确定,因为这可能仅适用于此示例或依赖于机器或我可能缺少的内容。所以任何人都可以证实这个案子?
三江源
答案 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
而不是NULL
或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
更清晰。
答案 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
。