一、BOOL、bool
1、类型不同
bool为布尔型、 BOOL为int型
2、长度不同
bool只有一个字节、BOOL为 int 因此长度根据实际环境来定,一般为4个字节
3、取值不同
bool取值 0为 false 、 非0为true;
BOOL取值 0 为false、1为true;
二、NULL、0、nullptr
1、定义不同
c语言中 NULL被定义为 #define NULL ((void *)0)
c++中NULL被定义为 #define NULL 0
nullptr是C++11中定义的
一般编译其的头文件会这么定义
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
2、原因
因为c++中不能将void *类型指针隐式转换成其他类型的指针类型,为了解决空指针的问题,所以引入了0来表示空指针。
但是在使用的过程中会出现问题,如:
有两个重载函数:
1、void function( type1 a, type2 *b);
2、void function( type1 a, int i);
当我们使用NULL的时候,因为NULL是0,所以会调用第二个函数,但我们实际上用的是空指针因此我们会做强制转换成
function(a, static_cast<type2 *>(NULL))、function(a, static_cast<type2 *>(0))让代码能够运行。
如上面所示如果两个函数同时存在的时候,我们能够发现有错误而会修改,
但是如果只存在1,而在自己重载的时候会在调用的时候,使用NULL,会出现错误,
而在检察的时候写的是NULL,并不容易检察出来需要强制转换。
因此在大多数c++的书籍当中会推荐使用0作为空指针。
3、nullptr
在没有c++11的时候我们可以自己实现一个《Imperfect c++》上面有一个实现
const
class nullptr_t
{
public:
template<class T>
inline operator T*() const
{ return 0; }
template<class C, class T>
inline operator T C::*() const
{ return 0; }
private:
void operator&() const;
} nullptr = {};
目前vs2010支持nullptr