bool是C语言的原生类型吗?

305

我注意到 Linux 内核代码使用了 bool,但是我认为 bool 是 C++ 类型。bool 是标准的 C 扩展吗(例如 ISO C90),还是 GCC 的扩展?


3
comp.lang.c FAQ 的第9节讨论了这个问题。 - Keith Thompson
2
直接链接:http://www.c-faq.com/bool/index.html - Ellen Spertus
1
Linux内核使用-std=gnu89,它作为C90的扩展支持_Bool。"include/linux/types.h"中有typedef _Bool bool; - Ian Abbott
1
另外,值得一提的是,Linux内核2.6.19是第一个使用typedef _Bool bool;(提交记录6e21828743247270d09a86756a0c11702500dbfb)并且需要GNU C 3.2或更高版本的内核。 - Ian Abbott
12个回答

2

C99添加了一个bool类型,其语义与C中以前存在的几乎所有整数类型(包括旨在此类目的而定义的用户定义和编译器扩展类型)根本不同,并且一些程序可能已经将其“type-def”为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__bit类型,则结果很可能是0、0、1、0(将bit视为大小为1的无符号位域或具有一个值位的无符号整数类型等效处理)。


2
我不明白在使用“typedef unsigned char bool”定义的C89程序中,如何将b设置为1?因为如果unsigned char ch = 2;会将ch设置为2,我本来期望b也是2... - Basya

-1

不存在这样的东西,可能只是int的宏


很好,有-1的存在...我相信问题是C90而不是99。 - sindre j
5
他说C标准,比如C90,我认为这包括C99。 - Matt Joiner
2
他特别提到了C90,而不是C99,所以我认为这就是他的意思。根据维基百科,唯一完全支持C99的编译器是Sun Microsystems的Sun Studio。那可不是一个被广泛接受的标准,是吧?可以说,大多数现代编译器确实实现了C99标准的部分内容,我应该提到这一点,以避免像你这样的愚蠢评论!顺便问一下,Java或C#与此有什么关系? - sindre j
8
“标准C扩展(例如ISO C90)”是指他感兴趣的C语言标准类型,而不是特指C90标准。对此的适当回答是:是的,像C90这样的C标准,特别是C99标准,确实实现了“bool”类型。 - Matt Joiner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接