我注意到Linux内核代码使用bool类型,但我以为bool类型是c++类型。bool是标准的C扩展名(例如,ISO C90)还是GCC扩展名?
当前回答
/* Many years ago, when the earth was still cooling, we used this: */
typedef enum
{
false = ( 1 == 0 ),
true = ( ! false )
} bool;
/* It has always worked for me. */
其他回答
stdbol .h是c99年引入的
不,在ISO C90中没有bool。
下面是标准C(不是C99)中的关键字列表:
汽车 打破 情况下 字符 常量 继续 默认的 做 双 其他的 枚举 走读生 浮动 为 转到 如果 int 长 注册 返回 短 签署 静态 结构体 开关 类型定义 联盟 无符号 无效 挥发性 而
这里有一篇文章讨论了在内核和标准中使用的C语言的其他一些区别:http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html
C99添加了一个bool类型,它的语义与C中之前存在的所有整数类型(包括用户定义的和用于此目的的编译器扩展类型)有本质上的不同,一些程序可能已经将其“类型定义”为bool。
例如,给定bool a = 0.1, b=2, c=255, d=256;, C99 bool类型将把所有四个对象都设置为1。如果C89程序使用typedef unsigned char bool,对象将分别接收0、2、255和0。如果它使用char,则值可能如上所示,或者c可能是-1。如果它使用了编译器扩展位或__bit类型,则结果可能是0,0,1,0(处理位的方式相当于大小为1的无符号位域,或具有一个值位的无符号整数类型)。
h定义了true和false宏,但是请记住它们被定义为1和0。
这就是sizeof(true) = sizeof(int)的原因,对于32位架构,sizeof(int)为4。
从C23开始,bool、true和false都是C关键字,不需要任何#include。
Bool成为基本的内置数据类型之一。
_Bool仍然有效,并被视为“替代拼写”。
头文件<stdbool.h>只提供过时的宏__bool_true_false_are_defined,它展开为整数常量1。
你可以在这里找到最新的草案: https://open-std.org/JTC1/SC22/WG14/www/docs/n2912.pdf