请参阅以下代码:
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)
,静态代码分析工具会发出一个信息。与NULL
和nullptr
相同。
所以,我使用的是:
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
。