c ++中if(指针)与if(指针!= NULL)之间的区别,cpplint问题

时间:2016-07-31 10:00:16

标签: c++ pointers coding-style cpplint

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

但它并没有说明两个陈述之间有任何区别。

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

进行检查
if(pointer)         //statement1

cpplint 表示你应该检查

if(pointer != NULL)        //statement2

所以我只是想知道, statement2 statement1 有什么好处吗?是否存在 statement1 可能会产生问题的情况?

  

工作:据我所知,这两个陈述的工作没有区别。它只是改变了编码风格。

     

我更喜欢使用 statement1 ,因为

     
      
  • 简单易读
  •   
  • 在比较中错误地忽略了(=)没有张力(==
  •   

但是cpplint正在提出这个问题,然后可能会有一些我错过的好处。

注意: Java也不支持 statement1

6 个答案:

答案 0 :(得分:6)

不,如果pointer实际上是指针类型没有区别,那么这里的所有内容都是编码风格的问题。编码风格又取决于不同社区的习惯,因此无法提出一般性建议。

我个人更喜欢第一个,因为它更短,更重要,避免使用虚假宏NULL

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

答案 1 :(得分:3)

您正在使用匈牙利表示法,可以判断变量是否为指针。只要它 - 无论是原生的还是聪明的 - 都没有区别。但是,当有人将其更改为其他间接类型(例如std::optional<>)时, second 将失败。所以我的建议是继续使用第一个:它不是Java,它是C ++。

答案 2 :(得分:2)

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

在C ++ 11及更高版本中,通常认为最好使用替代if (ptr != nullptr)

对于指针的简单检查,这些选项的差异非常具有风格。机制可能略有不同,但最终结果是相同的。

像大多数自动化检查器一样,cpplint倾向于 - 默认情况下 - 更多地抱怨违反某些风格指南的行为。是否有任何特定的指导方针是对还是错,取决于您的项目需要什么。

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

答案 3 :(得分:1)

C,onsider:

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

  

一个自动检查器,用于确保C ++文件符合 Google的C ++风格指南

再说一遍,重要的是某人的风格。比方说,如果你在google中为某些人的代码做出贡献,他们希望你能够遵循这种方式来促进轻松协作。

答案 4 :(得分:0)

在一种情况下,使用 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)可能会鼓励您遵循他们的编码风格,以保持先前学习的经验。

答案 5 :(得分:-1)

if(指针)和if(指针!= NULL)之间没有区别。 if(指针)用于代码优化。