Где 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/*/*
тоже не находит.
Итак, где это?
Ответы
Ответ 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_ */