Где находится stdbool.h? - PullRequest
       16

Где находится stdbool.h?

22 голосов
/ 01 ноября 2009

Я хочу найти определение _Bool в моей системе, поэтому для систем, где оно отсутствует, я могу его реализовать. Я видел различные определения для него здесь и на других сайтах, но хотел проверить систему на предмет окончательного определения.

Небольшая проблема в том, что я не могу найти, где определен _Bool или даже stdbool.h

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

И grep для _Bool на /usr/include/* и /usr/include/*/* тоже не находит.

Так где это?

Ответы [ 6 ]

13 голосов
/ 01 ноября 2009

_Bool - встроенный тип, поэтому не ожидайте найти его определение в заголовочном файле, даже в системном заголовочном файле.

Сказав это, угадав вашу систему по путям, которые вы ищете, вы смотрели в /usr/lib/gcc/*/*/include?

Мой "настоящий" stdbool.h живет там. Как и ожидалось, #define s bool будет _Bool. Поскольку _Bool является родным типом для компилятора, его определение в заголовочном файле отсутствует.

7 голосов
/ 01 ноября 2009

Как примечание:

_Bool определен в C99. Если вы строите свою программу с:

gcc -std=c99

Вы можете ожидать, что это будет там.

4 голосов
/ 01 ноября 2009

Другие люди ответили на вопрос о местонахождении _Bool и выяснили, объявлен ли C99 ... однако я не удовлетворен тем, как все сделали самодельные заявления.

Почему вы не можете полностью определить тип?

typedef enum { false, true } bool;
2 голосов
/ 09 февраля 2014

некоторые компиляторы не предлагают ключевые слова _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_ */
2 голосов
/ 01 ноября 2009

_Bool - это предопределенный тип в C99, очень похожий на int или double. Вы не найдете определения для int ни в одном заголовочном файле.

Что вы можете сделать, это

  • проверьте компилятор C99
  • если используется _Bool
  • в противном случае используйте другой тип (int или unsigned 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
0 голосов
/ 01 ноября 2009
$ 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 нет, компилируя объявление одной переменной без включений.

...