Подтвердить что ты не робот

Где stdbool.h?

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

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

[email protected]:~$ find /usr/include/* -name stdbool.h
/usr/include/c++/4.3/tr1/stdbool.h

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

Итак, где это?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

gcc -std=c99

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

Ответ 3

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

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

typedef enum { false, true } bool;

Ответ 4

_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

Ответ 5

$ 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 - не путем компиляции объявления одной переменной без включения.

Ответ 6

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