stdbool.h
1.0、参考
1.1、SinceC99
1.2、stdbool.h中的定义

C99之前,C语言中并没有布尔类型的关键字,C语言中用0表示逻辑假,非0表示逻辑真, 程序员往往利用这一点自己实现布尔类型,实现的方式如下:

#ifndef BOOL_H
#define BOOL_H

    typedef enum {
        false,
        true
    } bool;

#endif

C99增加了一个新的关键字_Bool,带来了语言级别的布尔类型。 不过,这个_Bool关键字太奇怪,并且为了兼容于C++C99同时提供了stdbool.h头文件,定义了3

下面是glibc中对stdbool.h的实现:

#ifndef _STDBOOL_H 
#define _STDBOOL_H

    #ifndef __cplusplus
        #define bool _Bool
        #define true 1
        #define false 0
    #else /* __cplusplus */
        /* Supportingin 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 */

实际上,就是定义了booltruefalse3。 在预处理的时候替换掉真正的值。

1.3、sizeof(_Bool)

C99只规定了_Bool类型的大小是至少能够存放01这两个整数值。 并没有规定具体的大小。这交给编译器自由发挥了。一般使用char类型来实现。也可能会使用unsigned int实现。

1.4、stdbool.h的使用示例
#include<stdbool.h>

int main() {
    _Bool isXXX = false;
    bool isYYY = true;
    bool isZZZ = 0;
    bool isVVV = 1;
    bool isTTT = -12;
    bool isNNN = 'A';

    return 0;
}

使用cc命令预处理:

cc -E test.c

得到如下内容:

int main() {
    _Bool isXXX = 0;
    _Bool isYYY = 1;
    _Bool isZZZ = 0;
    _Bool isVVV = 1;
    _Bool isTTT = -12;
    _Bool isNNN = 'A';

    return 0;
}

使用g++命令预处理:

g++ -E test.c

得到如下内容:

int main() {
    bool isXXX = 0;
    bool isYYY = 1;
    bool isZZZ = 0;
    bool isVVV = 1;
    bool isTTT = -12;
    bool isNNN = 'A';

    return 0;
}

注意:

很多编译器对待_Bool类型有自己的转换处理。如果是0赋值给_Bool类型的变量,那么就赋值0。 如果是任意其他数据,那么会赋值为1,不知道是不是所有编译器都这么处理的。因此,最好不要给_Bool类型的变量赋给除了01之外的值。