在C++中检查Null指针的首选方法是什么?

Ham*_*jan 3 c++ null pointers coding-style

选项A:

if (NULL == pSomethingColumn) // Yes, we use Yoda conditions
if (NULL != pSomethingColumn)
Run Code Online (Sandbox Code Playgroud)

要么

if (pSomethingColumn)
if (!pSomethingColumn)
Run Code Online (Sandbox Code Playgroud)

我正在寻找解释推理的参考资料.

我听说有人说从技术上讲NULL不一定要定义为0,而是来吧!如果是这种情况,那么吸盘(我们的应用程序)会以-2147483648不同的方式崩溃.

那么,如果NULL != 0,那么我们将遇到大问题.

请帮我解决一个毫无意义的语法辩论.我对这两种方式都不是特别关注; 只是寻找官方的方式.谢谢.

PS我们正在使用Visual Studio C++编译器.

Mar*_*som 11

我认为这是历史事故,零对应于假,非零对应于真; 我只想为布尔表达式保留这些表单.但是,我在其他人的代码中看到该表单时没有问题.

我的投票:

if (pSomethingColumn == NULL)
Run Code Online (Sandbox Code Playgroud)

不,我从来没有因忘记其中一个等号而被咬伤.只是幸运,或者可能非常小心.

  • 它也更自然地以这种方式阅读,所有现代编译器都警告你,如果你不小心在if语句中做了一个赋值(并且因为你(我们/我们所有人)将警告视为错误,它将无法编译):-) (2认同)
  • @Hamish:是的,但仅限警告级别4. (2认同)
  • @IanH:是的,用`-Wall`我得到'警告:声明没有效果.Clang也发出了类似的警告. (2认同)

Joh*_*ica 9

两者都没有明显好于另一个.从技术角度来看,它们是等价的.指针上下文中的数字0并不表示所有位为零; 它被定义为等效于用于表示空指针的任何位模式.NULL可以定义为0(void *) 0.这两个定义都是语法定义,并且没有说明基础位表示.

因此,if (!p)相同if (p == NULL)的是一样的if (p == 0),只要技术正确性去.

问题是风格问题.像所有风格问题一样,您的第一个倾向应该是匹配现行的编码标准.与代码库的其余部分做同样的事情.如果没有现行标准,则归结为个人偏好,我们鼓励您与同行制定编码标准.

(我个人喜欢使用显式比较并为布尔值保留较短的语法,但我很乐意使用if (!p)其他人正在做的事情.)