我注意到 Linux 内核代码使用了 bool,但是我认为 bool 是 C++ 类型。bool 是标准的 C 扩展吗(例如 ISO C90),还是 GCC 的扩展?
我注意到 Linux 内核代码使用了 bool,但是我认为 bool 是 C++ 类型。bool 是标准的 C 扩展吗(例如 ISO C90),还是 GCC 的扩展?
bool
在当前的C语言标准(C99)中存在,但在C89/90中不存在。
C99中本地类型实际上被称为_Bool
,而bool
是由stdbool.h
定义的标准库宏(预期解析为_Bool
)。类型为_Bool
的对象保持0或1,而true
和false
也是stdbool.h
中的宏。
顺便提一下,这意味着C预处理器将把#if true
解释为#if 0
,除非包含stdbool.h
。与此同时,C++预处理器要求本身识别true
作为一种语言字面量。
_Bool
占用了1位内存? - Geremia_Bool
值如何既可以直接寻址(即大小为 1 字节),又可以参与位域?一个 _Bool
数组仍然需要所有元素都是可寻址的(例如 _Bool* ptr = &boolArray[123]
)。 - Daiif
中的表达式将被计算并执行受控语句。 - Martin Bonner supports MonicaC99引入了一个内置的_Bool
数据类型(详见维基百科),如果您#include <stdbool.h>
,它会将_Bool
提供为宏bool
。
您特别询问了Linux内核。它假定存在_Bool
并自己提供了bool
typedef在include/linux/types.h中。
C99中使用 stdbool.h,但在C90中必须定义为typedef或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) { ... }
bool
和许多编译器的bit
类型不同。例如,bool x=4294967296LL;
或bool x=0.1;
在C99中会将x
设置为1,但大多数typedef版本可能会将其设置为0。 - supercat不,ISO C90 中没有 bool
.
这是标准 C 中的关键字列表(非 C99):
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
static
struct
switch
typedef
union
unsigned
void
volatile
while
这是一篇讨论内核和标准中一些其他差异的文章:http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html
/* 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. */
typedef enum { false, true };
同样好用。如果您坚持更加明确,可以写成 typedef enum { false = 0, true = 1 };
。(或者,如果您的编译器支持的话,只需包含 #include <stdbool.h>
;这已经是标准14年了。) - Keith Thompsontypedef enum { false, true } bool;
的预期工作方式。1 == 0
和 ! false
并不优雅,它们只是含糊其辞而已。编译器没有决策可做;它必须遵守语言定义的语义。 - Keith Thompsonfalse
被设置为语言规定不等式应该评估为什么值,而true
则被设置为其“相反”值(同样是任何那个值)。这样,人们就不必关心是{1,0},{-1,0},{0,1}等等,因为它保证在比较中起作用,因为它是使用比较进行制作的。” - MestreLionfalse
和 true
的数值。不了解 C 语言的人不是 C 代码的预期读者。而且,正如我所说,C 语言自上个千年以来就已经有了内置的布尔类型。 - Keith Thompson#include <stdbool.h>
是过去十年中最好的解决方案 :) 我只是喜欢这个相当"语言无关"的技巧来选择值。 - MestreLion_Bool
是 C99 中的一个关键字:它指定了一种类型,就像 int
或 double
一样。
6.5.2
2 声明为 _Bool 类型的对象足够大,可以存储值 0 和 1。
stdbool.h
定义了宏true
和false
,但请记住它们被定义为1和0。
这就是为什么sizeof(true)
等于sizeof(int)
,对于32位架构���说,这个值是4。
bool
、true
和false
成为了C语言的关键字,不需要任何#include
。
bool
成为了基本内置数据类型之一。
_Bool
仍然有效,并被视为“替代拼写”。<stdbool.h>
仅提供过时的宏__bool_true_false_are_defined
,该宏扩展为整数常量1
。
-std=gnu89
,它作为C90的扩展支持_Bool
。"include/linux/types.h"中有typedef _Bool bool;
。 - Ian Abbotttypedef _Bool bool;
(提交记录6e21828743247270d09a86756a0c11702500dbfb)并且需要GNU C 3.2或更高版本的内核。 - Ian Abbott