Saya perhatikan bahwa kode kernel Linux menggunakan bool, tapi saya pikir bool adalah tipe C ++. Apakah bool ekstensi C standar (misalnya, ISO C90) atau ekstensi GCC?
c
gcc
linux-kernel
boolean
asussex
sumber
sumber
-std=gnu89
yang mendukung_Bool
sebagai ekstensi ke C90. "include / linux / types.h" telahtypedef _Bool bool;
.typedef _Bool bool;
(komit 6e21828743247270d09a86756a0c11702500dbfb ) dan membutuhkan GNU C 3.2 atau lebih baru.Jawaban:
bool
ada di C - C99 saat ini, tetapi tidak di C89 / 90.Dalam C99 jenis asli sebenarnya disebut
_Bool
, sedangkanbool
makro perpustakaan standar didefinisikan dalamstdbool.h
(yang diharapkan untuk diselesaikan_Bool
). Objek tipe_Bool
memegang 0 atau 1, sementaratrue
danfalse
juga makro daristdbool.h
.Perhatikan, BTW, bahwa ini menyiratkan bahwa preprosesor C akan menafsirkan
#if true
sebagai#if 0
kecualistdbool.h
disertakan. Sementara itu, preprocessor C ++ diperlukan untuk secara asli mengenalitrue
sebagai bahasa literal.sumber
_Bool
membutuhkan 1 bit memori?_Bool
biasanya membutuhkan 1 byte memori. Namun, spesifikasi bahasa secara eksplisit mengizinkan penggunaan_Bool
sebagai tipe bidang-bit, yang berarti bahwa dengan menggunakan bidang-bit Anda dapat menekan_Bool
nilai menjadi bit tunggal (di dalam struct yang lebih besar)._Bool
nilai bisa langsung dialamatkan (yaitu berukuran 1 byte) dan juga berpartisipasi dalam bidang-bit? Array_Bool
masih akan membutuhkan semua elemennya untuk dialamatkan (misalnya_Bool* ptr = &boolArray[123]
).C99 menambahkan
_Bool
tipe data bawaan (lihat Wikipedia untuk detail), dan jika Anda#include <stdbool.h>
, itu menyediakanbool
sebagai makro untuk_Bool
.Anda bertanya tentang kernel Linux pada khususnya. Ini mengasumsikan keberadaan
_Bool
dan menyediakanbool
typedef sendiri di include / linux / types.h .sumber
Tidak, tidak ada
bool
dalam ISO C90.Berikut daftar kata kunci dalam standar C (bukan 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
Inilah artikel yang membahas beberapa perbedaan lain dengan C seperti yang digunakan dalam kernel dan standar: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html
sumber
C99 memilikinya di stdbool.h , tetapi di C90 harus didefinisikan sebagai typedef atau enum:
Kalau tidak:
sumber
bool
, dan juga berbeda daribit
tipe banyak kompiler . Misalnya,bool x=4294967296LL;
ataubool x=0.1;
akan diaturx
ke satu di C99, tetapi kemungkinan akan mengatur sebagian besar versi typedef menjadi nol.sumber
typedef enum { false, true };
sama baiknya. Jika Anda bersikeras untuk lebih eksplisit, Anda dapat menulistypedef enum { false = 0, true = 1 };
. (Atau hanya#include <stdbool.h>
jika kompiler Anda mendukungnya; itu sudah standar selama 14 tahun.)typedef enum { false, true } bool;
berfungsi persis seperti yang diharapkan.1 == 0
dan! false
tidak elegan, mereka hanya dikaburkan. Tidak ada keputusan untuk dibuat oleh kompiler; itu harus mematuhi semantik yang ditentukan oleh bahasa.false
disetel ke nilai apa pun yang menurut bahasa itu ketidaksetaraan harus dievaluasi, dantrue
ke "kebalikannya" ( lagi, apa pun itu). Dengan cara ini, seseorang seharusnya tidak peduli apakah itu {1, 0}, {-1, 0}, {0, 1}, dll, dan dijamin akan bekerja dalam perbandingan, karena itu dibuat dengan menggunakan satu.false
dantrue
. Siapa pun yang tidak tahu C bukan pemirsa yang diharapkan untuk kode C. Dan seperti yang saya katakan, C telah memiliki tipe Boolean bawaan sejak milenium sebelumnya._Bool
adalah kata kunci dalam C99: itu menentukan jenis, sepertiint
ataudouble
.sumber
C99 mendefinisikan bool,
true
danfalse
instdbool.h
.sumber
stdbool.h diperkenalkan pada c99
sumber
stdbool.h
mendefinisikan macro benar dan salah, tapi ingat itu didefinisikan sebagai 1 dan 0.Itu sebabnya
sizeof(true)
4.sumber
Tidak ada hal seperti itu, mungkin hanya makro untuk int
sumber
bool
jenis.C99 menambahkan
bool
jenis yang semantiknya secara fundamental berbeda dari hampir semua jenis bilangan bulat yang telah ada sebelumnya di C, termasuk jenis yang ditentukan pengguna dan ekstensi-ekstensi yang ditujukan untuk tujuan tersebut, dan yang beberapa program mungkin memiliki "tipe-def" ed untukbool
.Sebagai contoh, diberikan
bool a = 0.1, b=2, c=255, d=256;
,bool
tipe C99 akan mengatur keempat objek menjadi 1. Jika program C89 digunakantypedef unsigned char bool
, objek akan menerima masing-masing 0, 1, 255, dan 0. Jika digunakanchar
, nilainya mungkin seperti di atas, atauc
mungkin -1. Jika telah menggunakan ekstensibit
atau__bit
tipe kompiler , hasilnya kemungkinan akan 0, 0, 1, 0 (memperlakukanbit
dengan cara yang setara dengan bidang bit yang tidak ditandatangani dari ukuran 1, atau tipe bilangan bulat yang tidak ditandatangani dengan satu bit nilai).sumber