文档章节

【原创】bool、BOOL 和 _Bool 辨析

摩云飞
 摩云飞
发布于 2013/11/30 15:28
字数 1138
阅读 3006
收藏 52

      最近在搞跨平台编译的时候又遇到了 C99 标准支持的问题,主要体现在布尔类型问题上面。于是乎决定把这个问题彻底搞搞清楚,遂成此文。

bool、BOOL 和 _Bool 的区别

      bool 类型在 C++ 中以关键字的形式被支持,表示布尔类型,其对应变量的值只有真(true)和假(false)两种值。

      BOOL 类型在头文件 <windef.h> 中定义为 typedef int BOOL;在头文件 <wtypes.h> 中定义为 typedef long BOOL;
      BOOL 类型的长度视实际环境来定,一般可认为是 4 个字节。
      BOOL 是微软定义的表达布尔逻辑的类型。与 C++ 中的 bool 类型不同是,它是一个三值逻辑:TRUE、FALSE 和 ERROR。当返回值为大于 0 的整数时为 TRUE,返回值为 0 时为 FALSE,返回值为 -1 时为 ERROR。

      _Bool 是 C99 标准中定义的一个新关键字,以提供布尔类型。C2008 草案中只规定了 _Bool 类型的大小至少应能够存放 0 和 1 这两个值。而并没有规定具体的大小。这交给编译器自由发挥了。


【跨平台如何使用布尔类型】

      C++ 里有专门的 bool 关键字。但是在 C99 之前,C 语言里没有这样的类型。从 C99 标准开始,增加了关键字 _Bool 用来表示布尔类型。所以只要你的编译器支持 C99,你就可以直接使用布尔型了(当然,VC,VS系列编译器均不支持 C99)。除此之外,C99 为了在 C 中兼容 C++ 里对布尔类型的定义,又增加了一个头文件 stdbool.h。并在其中定义了 bool、true 和 false,让我们可以像 C++ 一样的定义和使用布尔类型。

使用布尔类型的几种方式:
a. 自己定义的“仿布尔类型”
在 C99 标准被支持之前,我们常常自己模仿定义布尔类型,方式有很多种,常见的有下面两种:

/* 第一种方法 */
typedef int BOOL;
#define TRUE 1
#define FALSE 0

/* 第二种方法 */ 

enum bool{false, true};

b. 使用 C99 新增的关键字 _Bool

      C99 新增关键字 _Bool 类型的长度为 1,只能取值为 0 或 1 。将任意非零值赋值给 _Bool 类型变量,都会先转换为 1,表示为真。将零值赋值给 _Bool 类型,结果为 0,表示为假。

c. 使用 C99 新增头文件 stdbool.h
      在 C++ 中,通过 bool 来定义布尔变量,通过 true 和 false 对布尔变量进行赋值。C99 为了让我们能够写出与 C++ 兼容的代码,添加了头文件 <stdbool.h> 。所以我们只要包含了该头文件,就可以像 C++ 中使用布尔变量的方式进行操作。

在我自己的 linux 系统中查找 stdbool.h 头文件,找到两处:
1. 系统定义
[root@Betty ~]# vi /usr/lib/syslinux/com32/include/stdbool.h

/*
 * $Id: stdbool.h,v 1.1 2003/04/16 06:32:31 hpa Exp $
 *
 * stdbool.h
 */

#ifndef _STDBOOL_H
#define _STDBOOL_H

#ifndef __cplusplus

#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)
# if !defined(__GNUC__) ||(__GNUC__ < 3)
  typedef char _Bool;           /* For C compilers without _Bool */
# endif
#endif

#define bool  _Bool
#define true  1
#define false 0

#else

/* C++ */
#define bool  bool
#define true  true
#define false false

#endif

#define __bool_true_false_are_defined 1

#endif /* _STDBOOL_H */

2. GCC 定义

[root@Betty ~]# vi /usr/lib/gcc/x86_64-redhat-linux/4.1.1/include/stdbool.h

/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING.  If not, write to
the Free Software Foundation, 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.  */

/* As a special exception, if you include this header file into source
   files compiled by GCC, this header file does not by itself cause
   the resulting executable to be covered by the GNU General Public
   License.  This exception does not however invalidate any other
   reasons why the executable file might be covered by the GNU General
   Public License.  */

/*
 * ISO C Standard:  7.16  Boolean type and values  <stdbool.h>
 */

#ifndef _STDBOOL_H
#define _STDBOOL_H

#ifndef __cplusplus

#define bool    _Bool
#define true    1
#define false   0

#else /* __cplusplus */

/* Supporting <stdbool.h> in C++ is a GCC extension.  */
#define _Bool   bool
#define bool    bool
#define false   false
#define true    true

#endif /* __cplusplus */

/* Signal that all the definitions are present.  */
#define __bool_true_false_are_defined   1

#endif  /* stdbool.h */

其实这两个头文件的定义本身还隐形的说明了一些信息,阅者自斟。

参考文章:
1.《 浅谈C语言中的布尔(bool)类型
2.《 C语言的布尔类型(_Bool)
3.《 C/C++ 中的bool类型 》(这个文章有料)


© 著作权归作者所有

摩云飞
粉丝 375
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
加载中

评论(10)

摩云飞
摩云飞 博主

引用来自“nullptr”的评论

我怎么觉得还有boolean以及Boolean的

boolean、Boolean和BOOLEAN等都是通过typedef定义出来的~
nullptr
nullptr
我怎么觉得还有boolean以及Boolean的
永远对你好
永远对你好
麻烦不麻烦。。你说。。之前看到一个不知真假的说c++的发明者说纯属娱乐大家。。。哎。。。
鳄鱼的眼泪
也只有C/C++这样的语言才需要程序员做各种辨析!
後方之水
後方之水

引用来自“摩云飞”的评论

引用来自“後方之水”的评论

/usr/lib/syslinux/com32/include/stdbool.h这个明明是syslinux的文件吧,怎么能叫系统定义。。。

请教一下,那这句话怎么描述比较好?我对linux内核的理解不多,我以为syslinux是系统级的东西

不是sys开头就是系统的。syslinux么,跟grub是同一类软件
摩云飞
摩云飞 博主

引用来自“梦无涯”的评论

C就是麻烦,一个布尔值,也能搞出这么多名堂。

其实不应该说C麻烦,是MS对C99不感冒的缘故~~
摩云飞
摩云飞 博主

引用来自“後方之水”的评论

/usr/lib/syslinux/com32/include/stdbool.h这个明明是syslinux的文件吧,怎么能叫系统定义。。。

请教一下,那这句话怎么描述比较好?我对linux内核的理解不多,我以为syslinux是系统级的东西
後方之水
後方之水
/usr/lib/syslinux/com32/include/stdbool.h这个明明是syslinux的文件吧,怎么能叫系统定义。。。
francis-x
francis-x
C就是麻烦,一个布尔值,也能搞出这么多名堂。
Onelong
Onelong
不错
也说Linq动态条件查询

1,构造表达式树 private Expression> getCondition() { Expression> expression = blog => true; if (!String.IsNullOrEmpty(Request["BlogClassID"])) { int blogClassID; if (Int32.TryP......

吞吞吐吐的
2017/08/31
0
0
Webkit对Javascipt的执行优先级

原创!转载请注明出自http://blog.csdn.net/lichwei1983 生成DOM Tree的过程中,HTMLTreeBuilder会经常检查看看自己是否已经暂停,以便执行脚本,比如: HTMLTreeBuilder处理token的时候,如...

长平狐
2013/04/25
67
0
HTML DOM focus() 方法之原理

原创!转载清注明出自http://blog.csdn.net/lichwei1983 1 支持焦点 W3C规定,只有web page明确设置了tabIndex的Element才定义为支持焦点,他是这么定义一个Node是否支持焦点的: bool Node:...

长平狐
2013/04/25
398
0
ios开发自定义Cell分割线(分隔线)选中(点击时)时消失

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/ziyuzhiye/article/details/94026036 /** 选中cell的时候调用 */ - (...

坤宇
06/28
0
0
使用SimpleIni解析ini文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/byxdaz/article/details/88144895 SimpleIni 是一个跨平台的 C++ 库,提供一个简单的API用于操作 ini 配置文件...

byxdaz
03/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 如果是个帅小伙你愿意和他出去吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《Ghost 》游戏《死亡搁浅》原声 《Ghost 》游戏(《死亡搁浅》原声) - Au/Ra / Alan Walker 手机党少年们想听歌,请使劲儿戳...

小小编辑
26分钟前
24
3
java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部