beautyofcomm

C语言中BOOL、bool和_Bool类型的联系和区别

0
阅读(3278)

最近看到MATLAB中logical类型变量会占用1个字节的内存空间,便想看看C语言是怎么存储bool类型变量的,居然挖出了一些C语言的历史。

C语言有多个版本的演进,在C99标准之前,C语言中并没有定义bool类型,所以微软自己定义了BOOL类型,在windef.h中定义如下:

typedef int BOOL;

这里BOOL是三值逻辑。

微软之所以要自己定义BOOL,是因为Microsoft Visual C++ 1.0于1992年推出,而支持bool类型的C99标准是1999年才推出的。在C99标准中,增加了新的关键字:_Bool

而在C++中bool是一直都有的数据类型。

来看看BOOL、_Bool和bool占用的内存

image

运行结果如下:

image

在做代码移植时,可能被移植的代码是多年之前写的,那个时候还没有bool类型变量,于是编程人员自己typedef int bool类型。当该代码被移植到新的IDE后,编译时可能会报错:"int"后面的"bool"非法。这是因为新版C标准,已将bool列为系统保留字,当然是不能由用户自定义的。解决的办法就是查看整个代码中用bool定义的变量是否都为二值逻辑,如果是,直接将typedef int bool删掉就行。

附录:C语言历史

【K&R C】1978年,Dennis Ritchie和Brian Kernighan合作推出了《The C Programming Language》的第一版(按照惯例,经典著作一定有简称,该著作简称为K&R),书末的参考指南(Reference Manual)一节给出了当时C语言的完整定义,成为那时C语言事实上的标准,人们称之为K&R C。从这一年以后,C语言被移植到了各种机型上,并受到了广泛的支持,使C语言在当时的软件开发中几乎一统天下。

【C89 (ANSI C)】随着C语言在多个领域的推广、应用,一些新的特性不断被各种编译器实现并添加进来。于是,建立一个新的“无歧义、于具体平台无关的C语言定义”成为越来越重要的事情。1983年,ASC X3(ANSI属下专门负责信息技术标准化的机构,现已改名为INCITS)成立了一个专门的技术委员会J11(J11是委员会编号,全称是X3J11),负责起草关于C语言的标准草案。1989年,草案被ANSI正式通过成为美国国家标准,被称为C89标准。

【C90 (ISO C)】随后,《The C Programming Language》第二版开始出版发行,书中内容根据ANSI C(C89)进行了更新。1990年,在ISO/IEC JTC1/SC22/WG14 (ISO/IEC联合技术第I委员会第22分委员会第14工作组)的努力下,ISO批准了ANSI C成为国际标准。于是ISO C(又称为 C90) 诞生了。除了标准文档在印刷编排上的某些细节不同外,ISO C(C90) 和 ANSI C(C89)诞生了。除了标准文档在印刷编排上的某些细节不同外,ISO C(C90)和ANSI C(C89) 在技术上完全一样。 

【C95】之后,ISO在1994、1996年分别出版了C90的技术勘误文档,更正了一些印刷错误,并在1995年通过了一份C90的技术补充,对C90进行了微小的扩充,经过扩充后的ISO C被称为C95。

【C99】1999年,ANSI和ISO又通过了最新版本的C语言标准和技术勘误文档,该标准被称为C99。这基本上是目前关于C语言的最新、最权威的定义了。