2009-05-06 20 views
19

सी ++ में बूल और बूल का उपयोग कब किया जाना चाहिए और क्यों?सी ++ में बूल और बूल का उपयोग कब किया जाना चाहिए?

मुझे लगता है कि बूल का उपयोग क्लीनर और अधिक पोर्टेबल है क्योंकि यह एक अंतर्निहित प्रकार है। लेकिन जब आप लीगेसी कोड/सी कोड के साथ इंटरैक्टिव होते हैं, या सी कोड/विंडोज एपीआई के साथ .NET से इंटर-ऑप करते हैं तो बूल अपरिहार्य है।

तो मेरी नीति है: सी ++ के अंदर बूल का उपयोग करें। बाहरी दुनिया से बात करते समय बूल का उपयोग करें, उदाहरण के लिए, विंडोज़ डीएलएल में निर्यात फ़ंक्शन।

क्या एक दूसरे के ऊपर उपयोग करने का एक निश्चित स्पष्टीकरण है?

+2

डाउनवॉटर के लिए: क्यों? अगर आप –

+0

@James नीचे प्रश्न को वोट देते हैं तो टिप्पणी छोड़ दें: संभवत: प्रश्न को व्यक्तिपरक होने के लिए संरचित किया गया था, और एक व्यक्तिपरक अर्थ में यह एक बहुत अच्छा सवाल नहीं है। मैंने इसे फिर से लिखने की कोशिश की है, इसलिए इसका थोड़ा और मूल्य हो सकता है, लेकिन मुझे शक है। – Pesto

+1

नीचे वोट क्यों? यह एक अच्छा है। –

उत्तर

6

मैथ्यू विल्सन की चर्चा BOOL, bool, और Imperfect C++ की धारा 13.4.2 में इसी तरह की। दोनों को मिलाकर समस्याग्रस्त हो सकता है, क्योंकि उनके पास आम तौर पर अलग-अलग आकार होते हैं (और इसलिए पॉइंटर्स और संदर्भ अंतर-परिवर्तनीय नहीं होते हैं), और bool से कोई विशेष आकार होने की गारंटी नहीं है। BOOL और bool या एक ही बूलियन जैसे दोनों C और C++ में काम करने के लिए अनुमति देने के लिए कोशिश कर के बीच मतभेद से अधिक सम करने के लिए typedefs या सशर्त compilating उपयोग करने के लिए कोशिश कर रहा है और भी बदतर है:

#if defined(__cplusplus) || \ 
    defined(bool) /* for C compilation with C99 bool (macro) */ 
typedef bool bool_t; 
#else 
typedef BOOL bool_t; 
#endif /* __cplusplus */ 

यह दृष्टिकोण का मतलब है कि एक समारोह की वापसी किस भाषा को कॉल करने के आधार पर टाइप भिन्न हो सकता है; विल्सन बताते हैं कि उन्होंने अपने कोड में एक से अधिक बग देखा है और अन्य 'इसका परिणाम है। उन्होंने निष्कर्ष निकाला:

इस अपूर्णता का समाधान यह है कि यह अक्सर, रोकथाम है। मैंने कभी भी bool का उपयोग किसी भी चीज के लिए नहीं किया है जिसे संभवत: एकाधिक लिंक इकाइयों-गतिशील/स्थैतिक पुस्तकालयों, आपूर्ति की गई ऑब्जेक्ट फ़ाइलों में उपयोग किया जा सकता है - जिसका मूल रूप से हेडर फ़ाइलों के बाहर दिखाई देने वाले कार्यों या कक्षाओं में नहीं है। व्यावहारिक उत्तर, जैसे कि यह है, एक छद्म-बूलियन प्रकार का उपयोग करना है, जो int का आकार है।

संक्षेप में, वह आपके दृष्टिकोण से सहमत होगा।

+2

मैं पूरी तरह से समझने में असफल रहा कि 32-बिट पूर्णांक को बूल में परिवर्तित करने में समस्या क्यों होगी। बूल में एक रूपांतरण सरल है: शून्य झूठ में परिवर्तित हो जाता है, और कुछ भी सच में परिवर्तित हो जाता है। यदि विल्सन 32-बिट पूर्णांक के बाइट को बंद कर रहा था, तो यह एकमात्र तरीका है जिसे मैं देख सकता हूं, तो समाधान बेवकूफ चाल के बिना कोड लिखना है, और संकलक को रूपांतरणों को संभालने देना है। इसी प्रकार, किसी तृतीय-पक्ष BOOL से C++ बूल में परिवर्तित करने में कोई खतरा नहीं है, जब तक कि कोई इसे पेंच करने के लिए निर्धारित न हो। –

+0

आप सही हैं, मैं अपने उदाहरण का पालन करने में असफल रहा और इसलिए कुछ महत्वपूर्ण जानकारी छोड़ दी। (विल्सन इस बात से सहमत हैं कि यह एक बेवकूफ गलती थी लेकिन तर्क है कि कोड जितना संभव हो उतना बेवकूफ साबित होना चाहिए।) मैंने बेहतर व्याख्या करने के लिए अपना सारांश अपडेट किया। –

4

जाहिर है, वहाँ BOOL उपयोग करने के लिए कोई अच्छा कारण नहीं है:

http://blogs.msdn.com/oldnewthing/archive/2008/03/25/8334558.aspx
http://blogs.msdn.com/oldnewthing/archive/2004/12/22/329884.aspx

+4

बेशक एक अच्छा कारण है। दूसरा लेख कहता है कि Win32 सी संगत रहने के लिए BOOL का उपयोग करता है। यदि आप विरासत कोड के साथ काम कर रहे हैं तो आपको BOOL का उपयोग करने की आवश्यकता होगी। –

+0

मुझे नहीं पता कि मुझे BOOL का उपयोग क्यों करना होगा, क्योंकि C99 बूल का समर्थन करता है, और सभी C89 कंपाइलर्स मैंने इसका भी समर्थन किया है। इसके अलावा, प्रश्न सी ++ के रूप में टैग किया गया है, सी –

+2

मैं हमेशा पुराने नए थिंग लिंक को ऊपर उठाता हूं ... soooo +1 – Aardvark

2

एक और स्थिति जहां आपको BOOL का उपयोग करना चाहिए: कॉलबैक फ़ंक्शन को लागू करते समय BOOL लेता है या देता है।

उदाहरण के लिए, EnumWindows() निम्नलिखित हस्ताक्षर के साथ उसे कॉलबैक फ़ंक्शन पर एक सूचक लेता है:

BOOL CALLBACK EnumWindowsProc(  
    HWND hwnd, 
    LPARAM lParam 
); 

आप इस के लिए bool का उपयोग करते हैं, तो आप अपने समारोह सूचक टाइपकास्ट करना होगा।

9

यदि बूल कुछ प्रकार का अभिन्न प्रकार है, और यह हमेशा होता है, और BOOL परिभाषित किया जाता है ताकि यह सही काम कर सके, मानक रूपांतरण स्वचालित रूप से सही हो जाएंगे। आप उन्हें एक दूसरे के साथ उपयोग नहीं कर सकते हैं, लेकिन आप करीब आ सकते हैं।

इंटरफ़ेस पर BOOL का उपयोग करें, जहां आपको Win32 API या जो कुछ भी बात करनी है। हर जगह बूल का प्रयोग करें।

-2

मुझे लगता है कि "सत्य"/"सत्य" और "झूठा"/"गलत" वाक्य रचनात्मक चीनी के रूप में, किसी समस्या का समाधान जो कभी अस्तित्व में नहीं था।मैंने हमेशा सोचा है कि "1" और "0" दोनों का उपयोग करना और पढ़ना आसान है।

जब आप रजिस्टरों में झंडे के बारे में सोचते हैं या बंद करते हैं, तो क्या आपको लगता है कि 1s और 0s या trues और falses में? क्या होता है यदि आप एक चर में कई झंडे स्टोर करना चाहते हैं? 1s और 0s सार्वभौमिक हैं।

मुझे लगता है कि "झूठा" शब्द अपने स्वयं के लिए बहुत लंबा है। जब मैं एक "0" देखता हूं, तो यह मेरे दिमाग में लाल स्टॉप साइन की तरह खड़ा होता है। रोकें संकेत लाल हैं क्योंकि रंग लाल लोगों को ध्यान देता है। "झूठा" शब्द पढ़ना एक हरा स्टॉप साइन देखना है।

तो, बूल और बूल के साथ नरक में। मैं int करने के लिए डिफ़ॉल्ट।

... लेकिन, वास्तव में, बूलियन झंडे प्राप्त करना एक भाषा में कम से कम चिंता है जिसमें सी ++ के रूप में गलती करने के कई तरीके हैं।

+2

ऐसा लगता है कि एक मुकाबला चाकू खतरनाक है क्योंकि यह आपकी आंखों को दूर कर सकता है। बेटा, आपको अपने चाकू को तेज रखने और सम्मान के साथ इसे संभालने की जरूरत है। क्योंकि, हाँ, अगर आप इसके बारे में बता रहे हैं तो यह आपकी आंखें निकाल लेगा। – knight666

+6

एक समस्या जो कभी अस्तित्व में नहीं थी? वास्तव में? यदि आप एक ऐसा फ़ंक्शन देखते हैं जिसमें वापसी प्रकार 'बूल' है तो यह आपको बताता है कि यह सच या गलत हो सकता है। यदि आप किसी ऐसे व्यक्ति को देखते हैं जिसमें वापसी प्रकार 'int' है जो आपको बताता है? – jalf

+0

मुझे लगता है कि "झूठा" शब्द अपने स्वयं के लिए बहुत लंबा है। चलिए कोड संपीड़न और एन्क्रिप्शन करते हैं ... परिवर्तनीय नाम बहुत लंबे हैं, चलिए वर्णमाला का उपयोग करते हैं;)। – AlexTheo

1

आप एक समारोह सी में लिखे उपयोग करना चाहते हैं ++ प्रबंधित कार्यक्रम में (उदाहरण के DLL पुस्तकालय में एम्बेडेड के लिए) (सी # में उदाहरण के लिए), आप BOOL उपयोग करने के लिए । यदि आप बूल वापस करते हैं, तो परिणाम हमेशा सत्य होगा - यह लंबे समय तक बग ज्ञात है और स्पष्ट रूप से अभी तक हल नहीं हुआ है (वीएस 2010, .NET Framework 4)।

सर्वश्रेष्ठ संबंध - स्पूक।

+0

ज़रूर! मुझे इस बग का सामना करना पड़ा है और मुझे यह महसूस करने में लंबा समय लगता है कि यह .NET की एक बग है। यद्यपि इसके लिए वर्कअराउंड (विशेषता) है। – zhaorufei

संबंधित मुद्दे