我注意到Linux内核代码使用bool类型,但我以为bool类型是c++类型。bool是标准的C扩展名(例如,ISO C90)还是GCC扩展名?
当前回答
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的无符号位域,或具有一个值位的无符号整数类型)。
其他回答
_Bool是C99中的关键字:它指定类型,就像int或double一样。
6.5.2 2声明为_Bool类型的对象 是否大到足以存储值0 和1。
没有这样的东西,可能只是int的宏
C99在stdbol .h中有它,但在C90中必须定义为类型定义或enum:
typedef int bool;
#define TRUE 1
#define FALSE 0
bool f = FALSE;
if (f) { ... }
另外:
typedef enum { FALSE, TRUE } boolean;
boolean b = FALSE;
if (b) { ... }
C99添加了一个内置的_Bool数据类型(详见维基百科),如果您#include <stdbool.h>,它将bool作为_Bool的宏提供。
您特别提到了Linux内核。它假定存在_Bool类型,并在include/linux/types.h中提供bool类型定义。
bool在当前C - C99中存在,但在C89/90中不存在。
在C99中,本机类型实际上被称为_Bool,而bool是stdbool.h中定义的标准库宏(它预期会解析为_Bool)。_Bool类型的对象持有0或1,而true和false也是来自stdboolh的宏。
顺便说一句,这意味着C预处理器将把#if true解释为#if 0,除非包含stdboolh .h。同时,c++预处理器需要将true原生识别为语言文字。
推荐文章
- C中的>>>=运算符是什么?
- Volatile boolean vs AtomicBoolean
- 如何测试Linux内核?
- GCC转储预处理器定义
- 如何在C中实现函数重载?
- 如何在Mac OS X 10.8 / Xcode 4.4上使用/安装gcc
- pty和tty是什么意思?
- 结构填充物和填料
- 如何禁用几行代码的GCC警告
- bool是否是原生C类型?
- .c vs .cc vs .cpp vs .hpp vs .h vs .cxx
- 实现基于整数的幂函数pow(int, int)的最有效方法
- 如何正确使用extern关键字在C
- 为什么gets函数如此危险以至于不应该使用它?
- 为什么NaN - NaN == 0.0与英特尔c++编译器?