我想知道是否NULL保证使用0C++,所以我搜索并发现了这些:
这个答案表明:
这是Bjarne Stroustrup的措辞,
在C++中,NULL的定义是0,因此只有美学差异.我更喜欢避免宏,所以我使用0. NULL的另一个问题是人们有时会错误地认为它与0不同和/或不是整数.
这似乎证实NULL总是0.
但根据cppreference.com:
Run Code Online (Sandbox Code Playgroud)#define NULL /*implementation-defined*/宏NULL是一个实现定义的空指针常量,可能是:
- >整数类型的整数常量表达式rvalue,其计算结果为零(直到C++ 11)
- >值为零的整数文字,或类型为std :: nullptr_t的prvalue(自C++ 11起)
这清楚地说NULL是依赖于实现.
这个答案说:
0(也称为C的NULL桥接到C++中)可能导致重载函数解析的模糊性,除其他外:
Run Code Online (Sandbox Code Playgroud)f(int); f(foo *);
这再次暗示这NULL是整数0,可能会导致歧义
我遇到了其他问题和答案,但它们主要是关于C语言,而不是C++.这里的一个评论说:
并且NULL保证为0
但同样,这是关于C.
总而言之,NULL总是0在C++中?C怎么样?是(对于每个标准实现)是否相同:
#define NULL 0
Run Code Online (Sandbox Code Playgroud)
注意:这个问题与空指针无关,问题是NULL在C++中是否保证是0整数.它是依赖于实现的吗?
NULL保证为0吗?
根据标准,NULL是一个空指针常量(即文字).究竟是哪一个,是实现定义的.
之前C++ 11,空指针常数积分常数,其积分值等于0,那么0或0l等
从C++ 11开始,有一个新的空指针文字nullptr,NULL可以定义为nullptr.(因此Bjarne引用的字面解释已经过时了).
在标准化之前:NULL可以(void*)0在C中定义.由于C++是基于C的,因此标准之前的某些C++方言可能使用了该定义,但这种定义不符合标准C++.
并且为了完整性:正如在下面的注释中链接的SO post中更详细地解释的,空指针常量为0并不一定意味着空指针地址的值为0(尽管地址为0是非常典型的).
可以得出以下结论:
NULL用来表示数字零(0如果合适,使用适当的类型后缀),也不要表示空终止符(使用'\0').NULL解析为指针过载.NULL,而是使用nullptr标准为> = C++ 11.在较旧的标准中,您可以使用(T*)NULL或者(T*)0如果您需要它来进行重载解析......那就说很少有情况下使用指针重载整数是有道理的.