Является ли bool родным типом C?
-
05-07-2019 - |
Вопрос
Я заметил, что код ядра Linux использует bool, но я думал, что bool относится к типу C ++.Является ли bool стандартным расширением C (например, ISO C90) или расширением GCC?
Решение
bool
существует в текущем C - C99, но не в C89 / 90.
В C99 нативный тип фактически называется _Bool
, а stdbool.h
- это стандартный библиотечный макрос, определенный в true
(который, как ожидается, разрешается в false
). Объекты типа #if true
содержат 0 или 1, а #if 0
и <=> также являются макросами из <=>.
Обратите внимание, что это означает, что препроцессор C будет интерпретировать <=> как <=>, если <=> не включено. Между тем, препроцессор C ++ должен распознавать <=> как языковой литерал.
Другие советы
C99 добавил встроенный _Bool
тип данных (подробности см. в Википедии ), и если вы #include <stdbool.h>
, он предоставляет bool
в качестве макроса для <=>.
Вы спрашивали о ядре Linux, в частности. Он предполагает наличие <=> и сам предоставляет <=> typedef в включают в себя / Linux / types.h . р>
Нет, здесь нет никакого bool
в стандарте ISO C90.
Вот список ключевых слов на стандартном C (не C99):
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
static
struct
switch
typedef
union
unsigned
void
volatile
while
Вот статья, в которой обсуждаются некоторые Другое различия с C, используемым в ядре и стандарте: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html
У C99 есть это в стандартный код.h, но в C90 он должен быть определен как typedef или enum:
typedef int bool;
#define TRUE 1
#define FALSE 0
bool f = FALSE;
if (f) { ... }
В качестве альтернативы:
typedef enum { FALSE, TRUE } boolean;
boolean b = FALSE;
if (b) { ... }
/* Many years ago, when the earth was still cooling, we used this: */
typedef enum
{
false = ( 1 == 0 ),
true = ( ! false )
} bool;
/* It has always worked for me. */
_Bool
это ключевое слово в C99:он определяет тип, точно так же, как int
или double
.
6.5.2
2 Объект, объявленный как тип _Bool , достаточно велик для хранения значений 0 и 1.
C99 определяет bool, true
и false
в stdbool.h
.
stdbool.h был представлен в c99
stdbool.h
определяет макросы true и false, но помните, что они определены как 1 и 0.
Вот почему sizeof(true)
равно 4.
Нет такого, вероятно, просто макрос для int
C99 добавил тип bool
, семантика которого принципиально отличается от таковых практически всех целочисленных типов, которые существовали ранее в C, включая определяемые пользователем типы и расширения компилятора, предназначенные для таких целей, и которые могут иметь некоторые программы " type-def " переведено в bool a = 0.1, b=2, c=255, d=256;
.
Например, если задано typedef unsigned char bool
, тип C99 char
установит все четыре объекта на 1. Если программа C89 использует c
, объекты получат 0, 1, 255 и 0 соответственно. Если используется bit
, значения могут быть такими же, как указано выше, или __bit
может быть -1. Если бы он использовал расширение компилятора <=> или <=>, результаты, скорее всего, были бы 0, 0, 1, 0 (обрабатывая <=> способом, эквивалентным битовому полю без знака размера 1, или целочисленный тип без знака с одним битом значения).