stdbool.h在哪里?

时间:2009-11-01 10:59:56

标签: c linux gcc boolean

我想在我的系统上找到_Bool定义,因此对于缺少它的系统,我可以实现它。我在这里和其他网站上看到过各种各样的定义,但是想要检查一下系统的最终定义。

轻微的问题,因为我找不到_Bool定义的地方甚至是stdbool.h

mussys@debmus:~$ find /usr/include/* -name stdbool.h
/usr/include/c++/4.3/tr1/stdbool.h

grep_Bool /usr/include/*的{​​{1}}也找不到。

那它在哪里?

6 个答案:

答案 0 :(得分:13)

_Bool是内置类型,所以不要期望在头文件中找到它的定义,甚至是系统头文件。

话虽如此,从你正在搜索的路径猜测你的系统,你看过/usr/lib/gcc/*/*/include吗?

我的“真实”stdbool.h住在那里。正如所料,#define bool_Bool。由于_Bool是编译器的本机类型,因此头文件中没有它的定义。

答案 1 :(得分:7)

作为说明:

_Bool在C99中定义。如果您使用以下代码构建程序:

gcc -std=c99

你可以期待它在那里。

答案 2 :(得分:4)

其他人已回复_Bool位置上的问题并查明是否宣布了C99 ......但是,我对每个人都给出的自制声明不满意。

为什么不完全定义类型?

typedef enum { false, true } bool;

答案 3 :(得分:2)

_Bool是C99中的预定义类型,非常类似于intdouble。您也不会在任何头文件中找到int的定义。

你能做的是

  • 检查编译器是C99
  • 如果使用_Bool
  • 否则使用其他类型(intunsigned char

例如:

#if defined __STDC__ && defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
/* have a C99 compiler */
typedef _Bool boolean;
#else
/* do not have a C99 compiler */
typedef unsigned char boolean;
#endif

答案 4 :(得分:2)

有些编译器不提供_Bool关键字,所以我编写了自己的stdbool.h:

#ifndef STDBOOL_H_
#define STDBOOL_H_

/**
 * stdbool.h
 * Author    - Yaping Xin
 * E-mail    - xinyp at live dot com
 * Date      - February 10, 2014
 * Copyright - You are free to use for any purpose except illegal acts
 * Warrenty  - None: don't blame me if it breaks something
 *
 * In ISO C99, stdbool.h is a standard header and _Bool is a keyword, but
 * some compilers don't offer these yet. This header file is an 
 * implementation of the stdbool.h header file.
 *
 */

#ifndef _Bool
typedef unsigned char _Bool;
#endif /* _Bool */

/**
 * Define the Boolean macros only if they are not already defined.
 */
#ifndef __bool_true_false_are_defined
#define bool _Bool
#define false 0 
#define true 1
#define __bool_true_false_are_defined 1
#endif /* __bool_true_false_are_defined */

#endif /* STDBOOL_H_ */

答案 5 :(得分:0)

$ echo '_Bool a;' | gcc -c -x c -
$ echo $?
0

$ echo 'bool a;' | gcc -x c -c -
<stdin>:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘a’

这表明_Bool是内置类型而bool不是,通过编译没有包含的单个变量声明。