क्या बूल एक देशी सी प्रकार है?


265

मैंने देखा है कि लिनक्स कर्नेल कोड बूल का उपयोग करता है, लेकिन मुझे लगा कि बूल एक C ++ प्रकार था। क्या बूल एक मानक C एक्सटेंशन है (जैसे, ISO C90) या GCC एक्सटेंशन?


2
Comp.lang.c के अनुभाग 9 में FAQ इस पर चर्चा करता है।
कीथ थॉम्पसन


लिनक्स कर्नेल का उपयोग करता है -std=gnu89जो _BoolC90 के विस्तार के रूप में समर्थन करता है । "/ linux / types.h को शामिल करें" typedef _Bool bool;
इयान एबॉट

इसके अलावा, एफडब्ल्यूआईडब्ल्यू, लिनक्स कर्नेल 2.6.19 उपयोग करने के लिए पहला संस्करण था typedef _Bool bool;( 6e2182874324727270d09a86756a0c11702500dbfb पर ) और इसके लिए GNU 3.2 या बाद की आवश्यकता थी।
इयान एबॉट

जवाबों:


368

bool वर्तमान C - C99 में मौजूद है, लेकिन C89 / 90 में नहीं।

C99 में मूल प्रकार को वास्तव में कहा जाता है _Bool, जबकि boolएक मानक लाइब्रेरी मैक्रो है जिसे stdbool.h(जो अपेक्षित रूप से हल होता है _Bool) में परिभाषित किया गया है । प्रकार की वस्तुओं _Bool, पकड़ या तो 0 या 1, जबकि trueऔर falseभी से मैक्रो नहीं है stdbool.h

ध्यान दें, BTW, यह संकेत मिलता है कि कि सी पूर्वप्रक्रमक व्याख्या करेगा #if trueके रूप में #if 0जब तक stdbool.hशामिल है। इस बीच, C ++ प्रीप्रोसेसर को मूल trueरूप से भाषा शाब्दिक के रूप में पहचानना आवश्यक है ।


62
2011 में प्रकाशित एक नया आईएसओ सी मानक है (इस उत्तर के बाद पोस्ट किया गया था)। ANSI ने हमेशा की तरह ISO C11 मानक को ANSI मानक के रूप में अपनाया है। ऐतिहासिक कारणों से, वाक्यांश "एएनएसआई सी" आमतौर पर (लेकिन अनिश्चित रूप से) एएनएसआई C89 / आईएसओ C90 मानक द्वारा परिभाषित भाषा को संदर्भित करता है। चूंकि सी मानकों को अब पहले आईएसओ द्वारा प्रकाशित किया गया है, और चूंकि गोद लेने के विभिन्न स्तरों के साथ तीन आईएसओ सी मानक हैं, इसलिए यह उस वर्ष को संदर्भित करने के लिए सबसे अच्छा है जो मानक (आईएसओ सी 90, आईएसओ सी 99, आईएसओ सी 11) से बचने के लिए था भ्रम की स्थिति।
कीथ थॉम्पसन

8
क्या इसका मतलब _Bool1 बिट मेमोरी है?
गेरिमिया

27
@ एनीमिया: क्यों नहीं? C में प्रत्येक पता योग्य वस्तु को कम से कम 1 बाइट पर कब्जा करना होगा। और वास्तविक जीवन में कार्यान्वयन _Boolआमतौर पर स्मृति के 1 बाइट लेता है। हालांकि, भाषा विनिर्देश स्पष्ट _Boolरूप से बिट-फ़ील्ड प्रकार के रूप में उपयोग करने की अनुमति देता है , जिसका अर्थ है कि बिट-फ़ील्ड का उपयोग करके आप _Boolकिसी एकल बिट (एक बड़ी संरचना के अंदर) में एक मान निचोड़ सकते हैं ।
२:१६ को ०१

@ एएनटीटी एक _Boolमूल्य दोनों को सीधे संबोधित करने योग्य हो सकता है (यानी 1 बाइट आकार) और एक बिट-फ़ील्ड में भी भाग लेते हैं? एक सरणी _Boolको अभी भी अपने सभी तत्वों को पता योग्य (जैसे _Bool* ptr = &boolArray[123]) की आवश्यकता होगी।
दाई

118

C99 ने एक अंतर्निहित _Boolडेटा प्रकार ( विवरण के लिए विकिपीडिया देखें) जोड़ा , और यदि आप #include <stdbool.h>, यह boolएक मैक्रो के रूप में प्रदान करता है _Bool

आपने विशेष रूप से लिनक्स कर्नेल के बारे में पूछा। यह की उपस्थिति मानता है _Boolऔर शामिल / linux / type.hbool में ही एक टाइपराइफ प्रदान करता है ।


26
ऐसा क्यों है, यह यह है कि ओटी को अपरिभाषित और पुनर्परिभाषित करने की अनुमति दी जाए जहां इसकी परिभाषा विरासत कोड के साथ टकराव का कारण बन सकती है।
क्लिफोर्ड

32

नहीं, boolISO 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


6
व्यावहारिक उद्देश्यों के लिए, क्या वास्तव में यह तब तक मायने रखता है जब तक कि अभी भी कोई सभ्य संकलक समर्थन नहीं है? यहां तक ​​कि जीसीसी के पास हाल ही में तक C99 सुविधाओं में से आधे नहीं थे, और MSVC में उनमें से अधिकांश नहीं हैं, और शायद कभी नहीं होगा ...
पावेल मिनावे

5
@ जोनाथन लेफ़लर, प्रश्नकर्ता ने विशेष रूप से आईएसओ C90 के बारे में पूछा। :) वास्तव में, आमतौर पर जब लोग एएनएसआई सी का संदर्भ देते हैं तो वे सी 90 की नकल करते हैं। मैं C99 का उपयोग करने के लिए वास्तव में उपयोग नहीं करता हूं या नहीं करता हूं और मुझे लगता है कि कई लोग उसी तरह महसूस करते हैं।
बॉबीशाफ्टो

6
@ बॉबीशैफ्टो: मूल पोस्टर ने स्पष्ट रूप से एक टिप्पणी में कहा कि C90 एक उदाहरण था।
कीथ थॉम्पसन

32

C99 में यह stdbool.h में है , लेकिन C90 में इसे टाइपडिफ या एनम के रूप में परिभाषित किया जाना चाहिए:

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

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

वैकल्पिक रूप से:

typedef enum { FALSE, TRUE } boolean;

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

5
ध्यान दें कि टंकण का व्यवहार C99 से भिन्न होगा bool, और कई संकलक के bitप्रकारों से भी भिन्न होगा । उदाहरण के लिए, bool x=4294967296LL;या bool x=0.1;स्थापित करेगा xC99 पर एक करने के लिए है, लेकिन संभावना शून्य करने के लिए सबसे typedef संस्करणों स्थापित करेगा।
सुपरकैट

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
प्रारंभिक मूल्य पूरी तरह से अनावश्यक हैं। typedef enum { false, true };बस के रूप में अच्छा है। यदि आप अधिक स्पष्ट होने पर जोर देते हैं, तो आप लिख सकते हैं typedef enum { false = 0, true = 1 };। (या सिर्फ #include <stdbool.h>अगर आपका कंपाइलर इसका समर्थन करता है, तो यह 14 साल के लिए मानक है।)
कीथ थॉम्पसन

9
@KeithThompson प्रारंभिक मान अनावश्यक हो सकते हैं, लेकिन यह उत्तर उन्हें बहुत ही सुरुचिपूर्ण तरीके से चुनता है, न कि मनमाने मूल्यों के साथ, बल्कि भाषाओं के अपने शब्दार्थ का उपयोग करके और संकलक को निर्णय लेने देता है।
MestreLion

11
@MestreLion: भाषा का अपना शब्दार्थ गारंटी है जो typedef enum { false, true } bool;ठीक उसी तरह से काम करता है जैसा कि अपेक्षित है। 1 == 0और ! falseसुरुचिपूर्ण नहीं हैं, वे केवल मोटे हैं। संकलक बनाने के लिए कोई निर्णय नहीं है; इसे भाषा द्वारा परिभाषित शब्दार्थ का पालन करना चाहिए।
कीथ थॉम्पसन

11
@KeithThompson: मुझे नहीं लगता कि वे मोटापे से ग्रस्त हैं, मुझे लगता है कि लेखक का इरादा सबसे "प्राकृतिक" मूल्यों को चुनना था: falseभाषा जो भी कहती है कि असमानता का मूल्यांकन किया जाना चाहिए, और trueइसके विपरीत " फिर से, जो कुछ भी है)। इस तरह से किसी को परवाह नहीं करनी चाहिए अगर वह {1, 0}, {-1, 0}, {0, 1}, आदि है, और उसकी तुलना में काम करने की गारंटी है, क्योंकि यह एक का उपयोग करके तैयार किया गया था ।
MestreLion

3
@MestreLion: C को जानने वाला कोई भी व्यक्ति के संख्यात्मक मूल्यों को जानता है falseऔर true। कोई भी व्यक्ति जो C को नहीं जानता है वह C कोड के लिए अपेक्षित दर्शक नहीं है। और जैसा कि मैंने कहा, पिछली सहस्राब्दी से सी में एक अंतर्निहित बूलियन प्रकार था।
कीथ थॉम्पसन

12

_BoolC99 में एक कीवर्ड है: यह एक प्रकार को निर्दिष्ट करता है, जैसे intया double

6.5.2

2 प्रकार के रूप में घोषित एक वस्तु _Bool 0 और 1 मानों को संग्रहीत करने के लिए पर्याप्त बड़ी है।


6

C99 बूल को परिभाषित करता है, trueऔर falseमें stdbool.h



1

stdbool.h मैक्रोज़ को सही और गलत परिभाषित करता है, लेकिन याद रखें कि इसे 1 और 0 के रूप में परिभाषित किया गया है।

इसीलिए sizeof(true)4 है।


0

ऐसी कोई बात नहीं, शायद इंट के लिए सिर्फ एक मैक्रो


-1 के साथ अच्छा लगा ... सवाल था C90 का, 99 का नहीं मेरा मानना ​​है
sindre j

5
अच्छी तरह से वह कहते हैं कि सी मानक जैसे C90, मुझे लगता है कि C99 शामिल हैं।
मैट जॉइनर

2
वह C90 का उल्लेख करता है, न कि C99, इसलिए मैं मानता हूं कि उसका मतलब क्या है। विकिपीडिया के अनुसार एकमात्र संकलक जो पूरी तरह से C99 का समर्थन करता है, सन माइक्रोसिस्टम्स से सन स्टूडियो है। अब, यह शायद ही एक व्यापक स्वीकृत मानक है? संभवतः अधिकांश आधुनिक संकलक C99 मानक के कुछ हिस्सों को लागू करते हैं, मुझे शायद यह उल्लेख करना चाहिए कि आपकी तरह बेवकूफ टिप्पणियों से बचने के लिए! इस btw के साथ जावा या सी # क्या करना है?
सिंध्रे जे

8
मानक C एक्सटेंशन (उदाहरण के लिए, ISO C90) उस तरह के C मानकों को वर्गीकृत कर रहा है जिसमें वह रुचि रखता है, विशेष रूप से C90 ही नहीं। इसका एक उपयुक्त उत्तर है, हां C C जैसे कि C90, विशेष रूप से C99 मानक, एक प्रकार को लागू करता हैbool
मैट जॉइनर

0

C99 ने एक boolप्रकार जोड़ा जिसका शब्दार्थ मूल रूप से C से पहले मौजूद सभी पूर्णांक प्रकारों के बारे में मौलिक रूप से भिन्न है, जिसमें ऐसे उद्देश्यों के लिए उपयोगकर्ता-परिभाषित और संकलक-विस्तार प्रकार शामिल हैं, और जिनमें कुछ कार्यक्रमों में "टाइप-डीफ़" हो सकता है। को bool

उदाहरण के लिए, दिया गया bool a = 0.1, b=2, c=255, d=256;, C99 boolप्रकार सभी चार वस्तुओं को 1 पर सेट करेगा। यदि C89 प्रोग्राम का उपयोग किया जाता है typedef unsigned char bool, तो ऑब्जेक्ट क्रमशः 0, 1, 255 और 0 प्राप्त करेंगे। यदि इसका उपयोग किया जाता है char, तो मान ऊपर के रूप में हो सकते हैं, या c-1 हो सकते हैं। यदि उसने संकलक-विस्तार bitया __bitप्रकार का उपयोग किया था , तो परिणाम संभवतः 0, 0, 1, 0 होगा ( bitएक तरह से आकार 1 के अहस्ताक्षरित बिट-फ़ील्ड के बराबर या एक मान वाले बिट के साथ अहस्ताक्षरित पूर्णांक प्रकार)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.