bool是原生C型吗?

asu*_*sex 248 c gcc boolean linux-kernel

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

AnT*_*AnT 348

bool 存在于当前的C-C99中,但不存在于C89/90中.

在C99中,实际上调用了本机类型_Bool,而boolstdbool.h其中定义了标准库宏(预期解析为_Bool).类型_Bool为0或1的对象,true而且false也是来自的宏stdbool.h.

注意,顺便说一句,这意味着C预处理器将解释#if true#if 0除非stdbool.h包括在内.同时,C++预处理器需要本地识别true为语言文字.

  • 2011年发布了一个新的ISO C标准(发布此答案后).像往常一样,ANSI采用ISO C11标准作为ANSI标准.由于历史原因,短语"ANSI C"通常(但不完整)是指ANSI C89/ISO C90标准定义的语言.由于C标准现在由ISO首先发布,并且由于有三种ISO C标准,采用不同的水平,因此最好参考标准被公布的年份(ISO C90,ISO C99,ISO C11)以避免任何标准.混乱. (60认同)
  • @Geremia:不,为什么?在C中,每个可寻址对象必须占用至少1个字节.在现实生活中,实现`_Bool`通常占用1个字节的内存.但是,语言规范明确允许使用`_Bool`作为位字段类型,这意味着通过使用位字段,您可以将`_Bool`值压缩为单个位(在更大的结构内). (25认同)
  • 这是否意味着`_Bool`占用1位内存? (7认同)

Jos*_*ley 115

C99添加了内置_Bool数据类型(详见维基百科),如果你#include <stdbool.h>,它提供bool了一个宏_Bool.

你特别询问了Linux内核.它假设include/linux/types.h中存在_Bool并提供了booltypedef .

  • 至于为什么,它是允许它未被定义和重新定义,其定义可能会导致与遗留代码的冲突. (26认同)

Bob*_*toe 32

不,boolISO C90中没有.

以下是标准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

这篇文章讨论了内核和标准中使用的与C的其他一些差异:http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html

  • 出于实际目的,只要仍然没有合适的编译器支持,它真的很重要吗?直到最近,即使是gcc也没有一半的C99功能,而且MSVC没有大部分功能,而且可能永远不会...... (6认同)
  • @BobbyShaftoe:原始海报在评论中明确表示C90就是一个例子. (6认同)
  • @Jonathan Leffler,提问者专门询问了ISO C90.:)事实上,通常当人们提到ANSI C他们meaqn C90.我不使用或真的计划使用C99,我认为很多人都有同感. (5认同)

Rob*_*Rob 32

C99在stdbool.h中有它,但在C90中它必须被定义为typedef或enum:

typedef int bool;
#define TRUE  1
#define FALSE 0

bool f = FALSE;
if (f) { ... }
Run Code Online (Sandbox Code Playgroud)

或者:

typedef enum { FALSE, TRUE } boolean;

boolean b = FALSE;
if (b) { ... }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,typedef的行为将与C99`bool`的行为不同,也不同于许多编译器的`bit`类型.例如,`bool x = 4294967296LL;`或`bool x = 0.1;`将在C99​​上将`x`设置为1,但可能会将大多数typedef版本设置为零. (5认同)

小智 16

/* 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. */
Run Code Online (Sandbox Code Playgroud)

  • 初始值完全没必要.`typedef enum {false,true};`同样好.如果你坚持更明确,你可以写`typedef enum {false = 0,true = 1};`.(或者只是`#include <stdbool.h>`如果你的编译器支持它;它已经标准了14年了.) (15认同)
  • @KeithThompson:我不认为它们是混淆的,我想作者的意图是选择最"自然"的值:`false`设置为语言所说的不平等值应评估的任何值,并且`true`它的"对立面"(再次,无论是什么).这样就不应该关心{1,0},{-1,0},{0,1}等等,并且保证在比较中有效,因为它是*精心设计的*使用一个. (11认同)
  • @MestreLion:语言自己的语义保证`typedef enum {false,true} bool;`完全按预期工作.`1 == 0`和`!false`不优雅,它们只是模糊不清.编译器没有决定; 它必须遵守语言定义的语义. (10认同)
  • @KeithThompson初始值可能是不必要的,但是这个答案以非常优雅的方式选择它们,而不是使用任意值,而是使用语言自己的语义并让编译器决定. (8认同)
  • @MestreLion:任何知道C的人都知道`false`和`true`的数值.任何不了解C的人都不是C代码的预期受众.正如我所说,自上一个千年以来,C已经有了内置的布尔类型. (2认同)
  • @KeithThompson:你对这两个陈述都是正确的.`#include <stdbool.h>`是过去十年中最好的解决方案:)我只是喜欢这种非常"语言不可知"的选择价值的技巧. (2认同)

pmg*_*pmg 12

_Bool是C99中的关键字:它指定一个类型,就像intdouble.

6.5.2

2声明为_Bool类型的对象足以存储值0和1.


sta*_*lue 6

C99定义bool,truefalsestdbool.h.


Neh*_*war 5

stdbool.h定义了宏truefalse,但请记住它们被定义为 1 和 0。

这就是为什么sizeof(true)equals sizeof(int),对于 32 位架构来说是 4。