【问题标题】:C++98 proper check for a null pointerC++98 正确检查空指针
【发布时间】:2017-12-09 04:50:45
【问题描述】:

C++11 引入了 nullptr 关键字,我没有。

我想有来自 C 的 NULL 宏,我从一些东西 herehere 中了解到在 C++ 中使用它,但我仍然不确定在这个旧的 C++ 标准。

我本质上希望能够使用 Boost Test 为我的测试用例编写这段代码:

aWrapperDataStructure x;
BOOST_CHECK_NE(x.get_ptr(), static_cast<decltype(x.get_ptr())>(nullptr));

但也许,正如 Tutorials Point 所建议的,考虑到约束,这样的事情更合适:

BOOST_CHECK(x.get_ptr()); //true when not NULL

不过,这让我很反感,所以我想知道这里的最佳做法是什么。如果它在网上某个地方,或者在 SO 上,它已经被埋很久了,我找不到它。谢谢!

【问题讨论】:

标签: c++98 null-pointer


【解决方案1】:

我觉得在这里回答我自己的问题不正确,因为我绝对没有资格回答,但我从 James Kanze 读到了这个答案here(尽管标准更新,它仍然被标记为 C++):

如果你使用 g++,你真的应该使用NULL

这对我来说绝对足够好。我发现这些 表达式 用于检查空指针:

(p != NULL) //requires #include <stddef.h>

(p != 0)

(p)

在这 3 个中,我在问题中提到的最后一个执行了从指针到布尔值的隐式转换 (hiss)。使用!=== 至少可以显式转换为布尔值,此外,使用NULL 表明您检查空指针的意图。

因此,我认为即使不使用 g++,表达式(p != NULL) 也是旧 C++ 标准最合适的方式。 (不过,我还是会屈服于别人的专业知识并标记他们的答案;我只是一名本科生。)

【讨论】:

  • 它的风格相当于一个微优化问题。您如何测试 null 不太可能对代码的可读性产生任何影响,并且您可以看到生产 C++ 中的所有方法。
  • 是的,但我无法告诉你我的代码有多少次因为这个愚蠢的问题而无法编译。甚至像BOOST_CHECK_NE(p, NULL); 这样的东西也是不允许的,因为“ISO C++ 禁止指针和整数之间的比较”。然而,BOOST_CHECK(p != NULL) 完全有效。
  • 啊。只需将NULL 转换为正确的指针类型。我还是新手 :)
【解决方案2】:

g++ 默认使用 C++11 有一段时间了。

因此,您可以使用 nullptr 并保持“现代”以及打字安全。

如果你必须是 C++11 之前的可移植版,NULL 是最好的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多