Bool yerel bir C tipi midir?


265

Linux çekirdek kodunun bool kullandığını fark ettim, ama bool'ün bir C ++ tipi olduğunu düşündüm. Bool standart bir C uzantısı mı (örn. ISO C90) veya bir GCC uzantısı mı?


2
Comp.lang.c SSS bölüm 9 bu konuyu tartışmaktadır.
Keith Thompson

1
Doğrudan bağlantı: c-faq.com/bool/index.html
Ellen Spertus

Linux çekirdeği kullanan -std=gnu89hangi destekleri _BoolC90 için bir uzantısı olarak. "include / linux / types.h" içeriyor typedef _Bool bool;.
Ian Abbott

Ayrıca, FWIW, Linux çekirdeği 2.6.19, ilk kullanılan sürümdütypedef _Bool bool; (taahhüt 6e21828743247270d09a86756a0c11702500dbfb ) ve GNU C 3.2 veya üstünü gerektiriyordu.
Ian Abbott

Yanıtlar:


368

bool mevcut C - C99'da bulunur, ancak C89 / 90'da yoktur.

C99'da yerel tür aslında çağrılırken _Bool, booltanımlanmış stdbool.h(beklenen bir şekilde çözülmesi beklenen _Bool) standart bir kitaplık makrosudur . Türdeki nesneler _Bool0 veya 1 tutarken, trueve falseaynı zamanda makrodan oluşur stdbool.h.

Not ve ödeyecekleri bu C önişlemci yorumlamak edeceğini ima #if trueolarak #if 0sürece stdbool.hdahil edilir. Bu arada, C ++ ön işlemcisinin yerel trueolarak bir dil değişmezi olarak tanınması gerekir .


62
2011'de yayınlanan yeni bir ISO C standardı var (bu cevap gönderildikten sonra). ANSI, her zamanki gibi, bir ANSI standardı olarak ISO C11 standardını benimsemiştir. Tarihsel nedenlerden ötürü, "ANSI C" ifadesi yaygın olarak (ancak yanlış) ANSI C89 / ISO C90 standardı tarafından tanımlanan dili ifade eder. C standartları şimdi ISO tarafından yayınlandığından ve farklı seviyelerde benimsenen üç ISO C standardı bulunduğundan, standartların yayınlanmaması için (ISO C90, ISO C99, ISO C11) bilinç bulanıklığı, konfüzyon.
Keith Thompson

8
Bu _Bool, 1 bit bellek kapladığı anlamına mı geliyor ?
Geremia

27
@Alemi: Hayır. Neden? C'de her adreslenebilir nesne en az 1 bayt işgal etmelidir. Ve gerçek hayatta uygulamalar _Boolgenellikle 1 bayt bellek alır. Bununla birlikte, dil belirtimi _Bool, bit alanı türü olarak kullanılmaya açıkça izin verir , yani bit alanlarını kullanarak bir _Booldeğeri tek bir bite (daha büyük bir yapı içinde) sıkıştırabilirsiniz .
AnT

@AnT Bir _Booldeğer hem doğrudan adreslenebilir (yani 1 bayt boyutunda) hem de bir bit alanına nasıl katılabilir? Bir dizi _Boolyine de tüm öğelerinin adreslenebilir olmasını gerektirir (ör. _Bool* ptr = &boolArray[123]).
Dai


32

Hayır, boolISO C90'da yok.

Standart C'deki (C99 değil) anahtar kelimelerin listesi:

  • 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

Çekirdek ve standartta kullanılan C ile diğer bazı farklılıkları tartışan bir makale : http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html


6
Pratik amaçlar için, hala iyi bir derleyici desteği olmadığı sürece gerçekten önemli mi? Gcc bile yakın zamana kadar C99 özelliklerinin yarısına sahip değildi ve MSVC bunların çoğuna sahip değil ve muhtemelen asla ...
Pavel Minaev

5
@Jonathan Leffler, soru soran kişi özellikle ISO C90 hakkında sorular sordu. :) Aslında, genellikle insanlar ANSI C'ye başvurduklarında C90 meaqn. C99 kullanmıyorum ya da gerçekten kullanmayı planlıyorum ve bence birçoğu aynı şekilde hissediyor.
BobbyShaftoe

6
@BobbyShaftoe: Orijinal poster bir yorumda açıkça C90'ın bir örnek olduğunu söyledi.
Keith Thompson

32

C99'da stdbool.h dosyasında bulunur , ancak C90'da typedef veya enum olarak tanımlanmalıdır:

typedef int bool;
#define TRUE  1
#define FALSE 0

bool f = FALSE;
if (f) { ... }

Alternatif:

typedef enum { FALSE, TRUE } boolean;

boolean b = FALSE;
if (b) { ... }

5
Typedef'in davranışının C99'dan boolfarklı ve birçok derleyicinin bittüründen farklı olacağını unutmayın . Örneğin, bool x=4294967296LL;veya C99'da bire bool x=0.1;ayarlanır x, ancak çoğu typedef sürümünün çoğunu sıfıra ayarlar.
supercat

17
/* 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. */

16
Başlangıç ​​değerleri tamamen gereksizdir. typedef enum { false, true };o kadar iyidir. Daha açık olmakta ısrar ederseniz, yazabilirsiniz typedef enum { false = 0, true = 1 };. (Ya da #include <stdbool.h>derleyiciniz destekliyorsa; 14 yıldır standarttır.)
Keith Thompson

9
@KeithThompson Başlangıç ​​değerleri gereksiz olabilir, ancak bu cevap onları keyfi değerlerle değil, dillerin kendi semantiğini kullanarak ve derleyicinin karar vermesine izin vererek çok zarif bir şekilde seçer.
MestreLion

11
@MestreLion: Dilin semantiği typedef enum { false, true } bool;tam olarak beklendiği gibi çalışacağını garanti eder . 1 == 0ve ! falsezarif değiller, sadece gizlenmişlerdir. Derleyicinin vermesi gereken bir karar yoktur; dil tarafından tanımlanan anlambilime uymalıdır.
Keith Thompson

11
@KeithThompson: Sanırım gizlendiklerini sanmıyorum, yazarın amacı en "doğal" değerleri seçmekti: falsedilin bir eşitsizliğin değerlendirilmesi gerektiğini söylediği herhangi bir değere trueve "karşıtına" ( yine, ne olursa olsun). Bu şekilde, bunun {1, 0}, {-1, 0}, {0, 1}, vb. Olup olmadığı umurumda olmamalıdır ve karşılaştırmalar halinde çalışacağı garanti edilir, çünkü biri kullanılarak hazırlanmıştır .
MestreLion

3
@MestreLion: C sayısal değerlerini bilen bilen herkes falseve true. C'yi bilmeyen herkes C kodu için beklenen kitle değildir. Dediğim gibi C, önceki binyıldan beri yerleşik bir Boole tipine sahipti.
Keith Thompson

12

_BoolC99'daki bir anahtar kelimedir: tıpkı intveya gibi bir tür belirtir double.

6.5.2

2 _Bool türü olarak bildirilen bir nesne, 0 ve 1 değerlerini depolayacak kadar büyüktür.




1

stdbool.h makroları doğru ve yanlış tanımlar, ancak 1 ve 0 olarak tanımlandığını unutmayın.

Bu yüzden sizeof(true)4.


0

Böyle bir şey yok, muhtemelen sadece int için bir makro


-1 ile güzel ... soru C90, değil inanıyorum 99
sindre j

5
iyi o C standart diyor mesela C90, ben o C99 içeren varsayalım.
Matt Joiner

2
C90'dan spesifik olarak bahsediyor, C99 DEĞİL, bu yüzden ne demek istediğini varsayıyorum. Vikipedi'ye göre C99'u tamamen destekleyen tek derleyici Sun Microsystems'dan Sun Studio'dur. Şimdi, bu geniş kabul görmüş bir standart değil mi? Muhtemelen çoğu modern derleyici C99 standardının parçalarını uyguluyor, muhtemelen sizin gibi aptalca yorumlardan kaçınmak için bahsetmeliydim! Java veya c # bu btw ile ne yapacak?
sindre j

8
standart C uzantısı (ör. ISO C90) , özellikle C90'ın kendisi değil, ilgilendiği C standartları türünü sınıflandırmaktadır. Buna uygun bir cevabı, evet özellikle C99 standart böyle C90 gibi standart bir C, yok bir uygulamaya booltürü.
Matt Joiner

0

C99 bool, anlambilimleri temelde C'de daha önce var olan neredeyse tüm tamsayı türlerinden temel olarak farklı olan bir tür ekledi ; bunlar, bu amaçlara yönelik kullanıcı tanımlı ve derleyici genişletme türleri dahil ve bazı programlarda "type-def" olabilir. için bool.

Örneğin bool a = 0.1, b=2, c=255, d=256;, C99 booltürü dört nesnenin tümünü 1 olarak ayarlar. Bir C89 programı kullanılırsa typedef unsigned char bool, nesneler sırasıyla 0, 1, 255 ve 0 alır. Kullanılırsa char, değerler yukarıdaki gibi colabilir veya -1 olabilir. Bir derleyici uzantısı bitveya __bittürü kullanmış olsaydı, sonuçlar muhtemelen 0, 0, 1, 0 ( bit1 boyutunda işaretsiz bir bit alanına veya bir değer bitine sahip işaretsiz bir tamsayı tipine eşdeğer şekilde muamele ) olurdu .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.