我将从这一点开始:一致性为王,决策不如代码库中的一致性重要。
在C ++中
在C ++中,NULL定义为0或0L。
如果您已经阅读了C ++编程语言 Bjarne Stroustrup建议在进行赋值时0
明确使用以避免NULL
宏的方法,我不确定他是否在比较中也做了同样的事情,因为阅读这本书已有一段时间了,我认为他只是做了if(some_ptr)
没有明确的比较,但是我对此感到模糊。
这样做的原因是该NULL
宏具有欺骗性(几乎所有宏都是如此),它实际上是0
文字的,而不是顾名思义的唯一类型。避免宏是C ++中的常规准则之一。另一方面,0
看起来像一个整数,当与指针进行比较或分配给指针时则不是。就我个人而言,我可以选择任何一种方式,但通常我会跳过显式比较(尽管有些人对此不满意,这可能就是为什么您有贡献者建议进行更改的原因)。
不管个人感觉如何,这在很大程度上都是最不邪恶的选择,因为没有一种正确的方法。
这很清楚,是一个常见的习惯用法,我更喜欢它,在比较期间没有偶然赋值的机会,它的内容很清楚:
if(some_ptr){;}
如果您知道这some_ptr
是指针类型,则很明显,但它也可能看起来像是整数比较:
if(some_ptr != 0){;}
这是清晰的,在通常情况下是有道理的...但是它是一个泄漏的抽象,NULL
实际上是0
字面意义,最终可能容易被滥用:
if(some_ptr != NULL){;}
C ++ 0x具有nullptr,由于它明确且准确,现在是首选方法,请小心意外赋值:
if(some_ptr != nullptr){;}
在您能够迁移到C ++ 0x之前,我会担心这是浪费时间,因为您担心使用的是哪种方法,它们都不够用,这就是为什么发明nullptr的原因(以及完美的转发所带来的通用编程问题) 。)最重要的是保持一致性。
在C中
C是另一只野兽。
在C中,可以将NULL定义为0或((void *)0),C99允许实现定义的空指针常量。因此,它实际上归结为实现的NULL定义,您将必须在标准库中对其进行检查。
宏非常常见,并且通常会大量使用宏来弥补语言和其他方面的通用编程支持方面的不足。语言更简单,对预处理器的依赖更加普遍。
从这个角度来看,我可能会建议NULL
在C中使用宏定义。