针对NULL或nullptr进行测试



请参阅以下代码:

if (m_hStatusBarPageBreakIcon != NULL)
VERIFY(DestroyIcon(m_hStatusBarPageBreakIcon));

有时,当我选择使用nullptr时,编译器会抱怨。但一般来说,使用nullptr可以吗?此变量的类型为HICON

假设编译器支持nullptr,检查NULL的句柄有效,但检查nullptr的句柄无法编译的唯一情况是句柄未定义为指针。

例如,由于Windows标头将NULL定义为0,因此对NULL的检查可能适用于整数句柄。确定为nullptr检查整数是错误的。

对于这种情况,如果某个句柄是整数,或者某个API被记录为接受NULL,那么我仍然会用nullptr替换NULL,而不是用文字0

我将从不同的角度来看待它。基本上我想要一个类型安全的代码。NULL甚至比nullptr更好,因为0是int类型,而nullptr是任意值。

如果你写uint i=3U,然后写更多的代码,然后写if (i == 0),静态代码分析工具会发出一个信息。与NULLnullptr相同。

所以,我使用的是:

template <typename T>
const T null(void) 
{
return static_cast<T>(0);
}

示例代码

typedef unsigned char uchar;
. . . 
uchar someVariable = null<uchar>();
SomeComplexClass *someComplexClass = null<SomeComplexClass *>();
. . . 
if (null<SomeComplexClass *>() == someComplexClass)
{
. . . 
}

正常的程序员会坐在那里说。那是什么胡说八道?

但是考虑一下,我们开发了一些ASIL D代码。然后重构代码。并且您会意外地将"SomeComplexClass"修改为"someOtherComplexClass"。

if (null<SomeComplexClass *>() == someOtherComplexClass) 

有了这个typesafe 0,静态代码分析工具将发出一个信息。

想想看,当你下次用ASIL D额定方向盘、刹车或油门踏板软件开车时。

BTW:在此类代码中,应尽可能避免auto

最新更新