C++ 避免将 NULL 与 0 进行比较

Posted

技术标签:

【中文标题】C++ 避免将 NULL 与 0 进行比较【英文标题】:C++ avoid compare NULL to 0 【发布时间】:2017-01-16 21:34:27 【问题描述】:

由于在 C++ 中,NULL 是必不可少的 0。每次我将未初始化的变量设置为 NULL 时,我想通过将其与 NULL 进行比较来检查该变量是否已初始化。但是,如果变量恰好在某处被赋值为 0,那么我无法判断它是否已被初始化。我肯定可以做一些工作来避免使用另一个包装对象来包装变量或使用标志的情况。但我正在寻找更优雅的解决方案。例如:

int b[4] = 1,2,3,0;
int a = NULL;
int i = 0;
while(true)
    if(a == 0)return;
    a = b[i++];

所以这里它会立即进入 if 语句,但我想等待 直到a被b的最后一个元素赋值为0

【问题讨论】:

你不能比较未初始化的变量,因为它们可能有所谓的陷阱值。 “由于在 C++ 中,NULL 是必不可少的,只是 0” 也许,也许不是。它扩展为一些“nullpointer-constant”,所以#define NULL nullptr 也是合法的。特别是,int a = NULL; 可能编译也可能不编译。 可能的骗子:***.com/questions/1226489/…***.com/questions/6822044/…(很遗憾,我的选票没了。) int a = NULL; 可能会被接受,但这是不合适的。 NULL 是一个扩展为空指针常量的宏,它很可能是整数常量0,但它旨在用于需要指针值的上下文中。由于int 不是指针类型,所以int a = 0; 完全等效且更清晰。 0 可以用作空指针常量这一事实几乎是历史的偶然。而NULL 宏不一定定义为0;它可以定义为nullptr 或其他,not 等同于0 “寻找更优雅的解决方案。” 您如何保证通过更好的启动设计来初始化变量?我发现“检查初始化”只是一个可怕的陷阱,会导致不必要的错误检查和分支生成。 【参考方案1】:

我想你要找的是boost::optional

#include <boost/optional.hpp>

...

boost::optional<int> maybe_int;

...

if (maybe_int) // test if it has been assigned to

    if (maybe_int.value() == 0) // has is been set to zero?
    
        // ...
    
    

【讨论】:

【参考方案2】:

我认为你在这里犯了一个概念上的错误。尽管 NULL 在某处被定义为 0,但这并不意味着它们在概念层面上是相同的。

NULL 是一个(通常)值为0 的指针。按照惯例,NULL 处不能有对象。因此,我们可以使用诸如MyClass *obj = NULL; 之类的代码来指定obj 处没有对象。这是因为obj 是一个指针。

对于非指针类型,这不起作用,我们需要使用其他工具,例如任意定义一个值无效(通常-1用于此)或使用optionals。

【讨论】:

以上是关于C++ 避免将 NULL 与 0 进行比较的主要内容,如果未能解决你的问题,请参考以下文章

C++比较char数组和字符串

C++比较char数组和字符串

使用直方图比较 C++ 匹配图像

将常量与空集进行比较时,Db2 IN 谓词产生 NULL

是否将两个 void 指针与 C++ 中定义的不同对象进行比较?

将unicode字符串与c ++符号进行比较?