c++ 中 if(pointer) 与 if(pointer != NULL) 的区别,cpplint 问题

difference between if(pointer) vs if(pointer != NULL) in c++, cpplint issue

我已经在网上查看了这个 post Can I use if (pointer) instead of if (pointer != NULL)? 和其他一些 post。

但这并没有说明两种说法之间有什么区别。

问题: 当我在我的 cpp 代码中 运行 cpplint.py 时,我发现检查指针是否为 NULL 的问题。 我更喜欢使用简单的

来检查
if(pointer)         //statement1

但是 cpplint 说你应该检查

if(pointer != NULL)        //statement2

所以我只想知道,statement2statement1 有什么好处吗?在某些情况下 statement1 可能会产生问题吗?

Working: As per my knowledge there is no difference in working of both statements. Its just a change of coding style.

I prefer to use like statement1, because

  • Its Simple, Readable
  • No Tension of missing (=) by mistake over equality(==) in a comparison

但 cpplint 将此作为问题提出,那么可能会有一些我错过的好处。

注: Java也不支持statement1.

不,如果pointer真的是一个指针类型就没有区别,所以这里的一切都是编码风格的问题。编码风格又取决于不同社区的习惯,因此无法给出一般性建议。

我个人更喜欢第一个,因为它更短、更切题并且避免了使用伪造的宏NULL

在 C 中 NULL 可以是非常不同的东西(整数或指针),在 C++ 中它的使用现在甚至被弃用了。你至少应该在那里使用 nullptr

您使用的是匈牙利表示法,可以判断变量是否为指针。只要它是本地的或智能的,就没有区别。但是,当有人将其更改为另一种间接类型(例如 std::optional<>)时,second 将失败。所以我的建议是继续使用第一个:它不是 Java,它是 C++。

C,旁观者:

int *ptr=malloc(10*sizeof *ptr);
free(ptr); // though the memory is freed, the ptr is not auto-set to NULL
if (ptr)
{
printf ("ptr is not null\n");
}

所以你应该把

ptr=NULL; // ptr is explicitly made to point at nothing
// The above step is mandatory.

free.

之后

因此,作为 if-statement 中的回应,可能会建议您这样做

if ( ptr == NULL ) // This is mostly a coding style & improves readability?

或更好

if ( NULL == ptr ) // less chances of error

嗯,[ site ]cpplint 是 :

An automated checker to make sure a C++ file follows Google's C++ style guide

所以再说一次,重要的是某人的风格。假设,如果您在 google 中为某人的代码做出贡献,他们希望您遵循这种有助于轻松协作的风格。

if(pointer) 和 if(pointer != NULL) 没有区别。 if(pointer) 用于代码优化。

在 C++ 中,假设 ptr 是一个指针,比较 if (ptr)if (ptr != NULL) 在功能上是等价的。

在 C++11 及更高版本中,通常认为使用替代方法 if (ptr != nullptr) 更可取。

对于指针的简单检查,这些选项的差异确实是风格上的。机制可能略有不同,但最终结果是一样的。

cpplint 与大多数自动检查器一样,默认情况下倾向于更多地抱怨违反某些样式指南的情况。任何特定的指南集是对还是错取决于您的项目需要什么。

对于可以与指针进行比较的 class 类型(例如智能指针类型),首选测试取决于该类型支持的操作集(比较运算符、隐式转换等)。

有一种情况可能会使用 statement1 造成问题。

考虑以下可能有两种不同含义的代码。

bool* is_done = ...;

// Is this checking if `is_done` is not null, or actually
// intended to check if `*is_done` is true?
if (is_done) {
  ...
}

如果您打算进行空检查,那没问题。但是,如果您的初衷是检查 *is_done 是否为真,但不小心漏掉了一个星号,则此代码可能会导致完全不需要的行为,并且需要您花费 X 小时来找出罪魁祸首。

这可以通过显式检查像

这样的语句来避免
// Now this results in a compile error and forces you to write
// `*is_done` instead.
if (is_done == true) {
  ...
}

这适用于任何可以隐式转换为 bool 的类型,例如 std::unique_ptr。

有人可能会争辩说上述情况太少见,并且仍然更喜欢 statement1 以简化。我认为这是公平的,两种风格都可以接受。但是一些组织,例如 Google,可能会鼓励您遵循他们的编码风格,以保持他们之前学到的教训。