Я заметил, что в коде ядра Linux используется bool, но я думал, что bool - это тип С++. Является ли bool стандартным расширением C (например, ISO C90) или расширением GCC?
bool
существует в текущем C - C99, но не в C89/90.
В C99 нативный тип на самом деле называется _Bool
, а bool
- стандартный библиотечный макрос, определенный в stdbool.h
(который, как ожидается, разрешается до _Bool
). Объекты типа _Bool
содержат либо 0, либо 1, а true
и false
также являются макросами из stdbool.h
.
_Bool
занимает 1 бит памяти?
C99 добавил встроенный тип данных _Bool
(подробнее см. Wikipedia), и если вы #include <stdbool.h>
, он предоставляет bool
в качестве макроса до _Bool
.
Вы спрашивали о ядре Linux в частности. Он предполагает наличие _Bool
и предоставляет bool
typedef непосредственно в include/linux/types.h.
C99 имеет его в stdbool.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) { ... }
bool
C99, а также от bit
типов многих компиляторов. Например, bool x=4294967296LL;
или bool x=0.1;
установит x
в единицу на C99, но, скорее всего, установит для большинства версий typedef значение ноль
Нет, в ISO C90 нет bool
.
Здесь список ключевых слов в стандарте 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
/* 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. */
typedef enum { false, true };
это так же хорошо. Если вы настаиваете на том, чтобы быть более явным, вы можете написать typedef enum { false = 0, true = 1 };
, (Или просто #include <stdbool.h>
если ваш компилятор поддерживает его; он был стандартным в течение 14 лет.)
_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