bool是C的本地类型吗?

26 浏览
0 Comments

bool是C的本地类型吗?

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

0
0 Comments

在C99标准中,可以通过包含stdbool.h头文件来直接使用bool类型。然而,在C90标准中,bool类型必须通过typedef或enum进行定义。以下是一种常见的实现方式:

typedef int bool;
#define TRUE  1
#define FALSE 0
bool f = FALSE;
if (f) { ... }

另一种实现方式是使用enum:

typedef enum { FALSE, TRUE } boolean;
boolean b = FALSE;
if (b) { ... }

需要注意的是,这种typedef的行为与C99的bool类型以及许多编译器的bit类型不同。例如,在C99中,bool x=4294967296LL;或bool x=0.1;会将x设置为1,但大多数typedef版本可能会将其设置为0。

因此,问题"Is bool a native C type?"的出现是因为在不同的C标准中,bool类型的定义方式不同,这可能会导致不同的行为。要解决这个问题,可以根据所使用的C标准选择合适的bool类型定义方式。在C99中,可以直接使用stdbool.h头文件中定义的bool类型。而在C90中,可以使用typedef或enum来定义bool类型。

0
0 Comments

C99在C语言中引入了一个内置的_Bool数据类型(详见维基百科),如果包含头文件,则会将bool定义为_Bool的宏。

你特别提到了Linux内核。Linux内核假设_Bool存在,并在include/linux/types.h中自己定义了一个bool类型。

至于为什么这样做,是为了允许_Bool的定义在可能与旧代码冲突的地方被取消定义和重新定义。

0
0 Comments

bool是C语言的本地类型吗?

在当前的C语言标准中,C99中存在bool类型,但在C89/90中不存在。

在C99中,本地类型实际上被称为_Bool,而bool是一个在stdbool.h中定义的标准库宏(预期解析为_Bool)。_Bool类型的对象只能保存0或1,而true和false也是来自stdbool.h的宏。

需要注意的是,C预处理器将会将#if true解释为#if 0,除非包含了stdbool.h。与此同时,C++预处理器被要求原生地将true识别为语言字面值。

在这个回答发布之后,有一个新的ISO C标准在2011年发布。ANSI通常将ISO C11标准作为ANSI标准采纳。出于历史原因,“ANSI C”一词通常(但不正确地)指的是ANSI C89 / ISO C90标准定义的语言。由于C标准现在首先由ISO发布,并且有三个ISO C标准,采用的程度各不相同,最好用标准发布的年份(ISO C90、ISO C99、ISO C11)来避免任何混淆。

这是否意味着_Bool占用1个字节的内存?

:不是的。为什么呢?在C语言中,每个可寻址的对象至少要占用1个字节。在实际实现中,_Bool通常占用1个字节的内存。然而,语言规范明确允许将_Bool用作位字段类型,这意味着通过使用位字段,可以将_Bool值压缩到一个位中(在较大的结构体内部)。

一个_Bool值既可以是直接寻址的(即占用1个字节),也可以参与位字段吗?一个_Bool数组仍然需要所有元素都是可寻址的(例如_Bool* ptr = &boolArray[123])。

你的评论应该是一个完全独立的SO问题。

例如,在C89中,如果没有本地bool类型,条件语句和比较运算符是如何工作的?如果我写if (5 < 6),底层是否都被转换为int类型?

运算符<返回一个int值 - 零表示假,非零表示真(我认为它需要返回1,但我懒得查了)。在if中,表达式被计算,如果表达式的值非零(或指针类型的非NULL),则执行控制语句。

这在C23中发生了变化(en.cppreference.com/w/c/language/bool_constant)。

0