在最近的一次代码审查中,一名贡献者试图强制NULL以下列方式对指针进行所有检查:
NULL
int * some_ptr; // ... if (some_ptr == NULL) { // Handle null-pointer error } else { // Proceed }
代替
int * some_ptr; // ... if (some_ptr) { // Proceed } else { // Handle null-pointer error }
我同意他的方式更清楚一点,因为它明确地说“确保此指针不是 NULL”,但我会反驳说,任何处理此代码的人都会理解在if语句隐式检查NULL. 另外我觉得第二种方法引入同类错误的可能性较小:
if
if (some_ptr = NULL)
这只是查找和调试的绝对痛苦。
你更喜欢哪种方式,为什么?
以我的经验,形式if (ptr)或测试if (!ptr)是首选。它们不依赖于符号的定义NULL。他们不会暴露意外分配的机会。它们清晰简洁。
if (ptr)
if (!ptr)
编辑: 正如 SoapBox 在评论中指出的那样,它们与 C++ 类兼容,例如auto_ptr充当指针并提供转换以bool完全启用此习惯用法的对象。对于这些对象,显式比较NULL必须调用到指针的转换,这可能具有其他语义副作用或者比bool转换所暗示的简单存在检查更昂贵。
auto_ptr
bool
我喜欢在没有不需要文本的情况下说明其含义的代码。if (ptr != NULL)具有相同的含义,if (ptr)但以冗余特异性为代价。下一个合乎逻辑的事情是写作if ((ptr != NULL) == TRUE),而这种方式就是疯狂。C语言很清楚,通过if,while等测试的布尔值具有特定含义,非零值是真,零是假。冗余并没有使它更清楚。
if (ptr != NULL)
if ((ptr != NULL) == TRUE)
while