किसी भी स्पष्ट रूपांतरण के लिए कोई ज़रूरत नहीं है:: मैं संभव तरीके के बहुत सारे कल्पना कर सकते हैं
BOOL x = some_value;
bool b = x;
bool
पर संख्यात्मक प्रकार के निहित रूपांतरण 0
के एक मूल्य के लिए false
पैदावार, और true
के लिए कोई गैर-शून्य मान।
संयोग से, आपने हमें बताया है कि <windows.h>
FALSE
और TRUE
को परिभाषित करता है। यह BOOL
को कैसे परिभाषित करता है? (आपकी टिप्पणी से, यह typedef int BOOL;
)
लेकिन कुछ कंपाइलर इस अंतर्निहित रूपांतरण के बारे में चेतावनी दे सकते हैं, भले ही यह पूरी तरह से वैध कोड है। कंपाइलर्स आपके पसंदीदा कोड के बारे में चेतावनी देने के लिए स्वतंत्र हैं, जिसमें आपके कोड को लिखने के लिए उपयोग किए गए बदसूरत फ़ॉन्ट भी शामिल हैं। जी ++, उदाहरण के लिए, परिवर्तन के बारे में, यहां तक कि साथ में शिकायत नहीं करता है:
g++ -std=c++11 -pedantic -Wall -Wextra ...
लेकिन this online Visual C++ compiler के अनुसार, कुलपति ++ एक चेतावनी का उत्पादन करता है:
warning C4800: 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
यहां तक कि एक
static_cast
साथ
, यह अभी भी पैदा करता है चेतावनी।
आप !!x
या x ? true : false
का उपयोग कर चेतावनी से बच सकते हैं। लेकिन मुझे यकीन नहीं है कि बीमारी से इलाज बेहतर है।
ऐसा करने का सरल और सही तरीका केवल मूल्य असाइन करना है और सही चीज़ करने के लिए अंतर्निहित रूपांतरण पर भरोसा करना है (यह होगा)।
यदि आपके पास कंपाइलर चेतावनियों से बचने के लिए अतिरिक्त आवश्यकता है, तो यह C++ भाषा के बजाय दृश्य C++ के बारे में अधिक प्रश्न बन जाता है। स्रोत को बदलने के बिना कुछ चेतावनियों को बाधित करने का कोई तरीका भी हो सकता है - हालांकि वे वास्तव में समझ में आने पर उन चेतावनियों को खोने का जोखिम उठाते हैं। एक टिप्पणी में, डाइटर लुकिंग ने सुझाव दिया:
#pragma warning(disable: 4800) // forcing value to bool 'true' or 'false' (performance warning)
लेकिन ऐसा लगता है कि इसे अभी भी स्रोत को संशोधित करने की आवश्यकता है। शायद कुछ समकक्ष है जो नहीं करता है।
एक और बात: BOOL
के बाद से वास्तव में टाइप है int
, इस प्रस्तावित समाधान:
bool c = (x == TRUE);
दूसरों के बराबर नहीं है। कोई भी गैर-शून्य int
को सत्य माना जाता है, लेकिन केवल 1
मान बराबर से TRUE
पर है।उपर्युक्त c
false
पर x == 2
सेट करेगा, उदाहरण के लिए - जबकि if (x)
अभी भी इसे एक वास्तविक स्थिति के रूप में पेश करेगा। समानता के लिए बूलियन मानों की तुलना कभी भी true
या TRUE
से करें। (उन्हें false
या FALSE
सुरक्षित, लेकिन अभी भी अनावश्यक है की तुलना करना;। कि क्या !
ऑपरेटर के लिए है)
यह सब मान लिया गया है, तो आप प्रकार BOOL
के एक मूल्य है, तो आप केवल परवाह है कि क्या यह falsish या truthy है (शून्य या शून्य नहीं)। दुर्भाग्यवश, यह हमेशा मामला नहीं हो सकता है। Ben Voight's answer बताते हैं, माइक्रोसॉफ्ट के एपीआई में कम से कम एक समारोह, GetMessage शामिल है, जो BOOL
परिणाम देता है जो एक साधारण बूलियन मान नहीं है। इस तरह के एक भयानक मामले में, BOOL
से bool
में रूपांतरण उचित नहीं है यदि आपको एकाधिक गैर-शून्य मानों में अंतर करने की आवश्यकता है।
आखिरकार, मैं एक ऐसी भाषा के लिए
BOOL
को परिभाषित करने के लिए माइक्रोसॉफ्ट को दोष देता हूं, जिसमें पहले से ही पूरी तरह से अच्छी तरह से व्यवहार किया गया है
bool
प्रकार।
असल में यह काफी उचित नहीं है; इसका उपयोग उन एपीआई में किया जाता है जिन्हें सी और सी ++ दोनों से सुलभ होने की आवश्यकता होती है। BOOL
की माइक्रोसॉफ्ट की परिभाषा शायद उनके सी कार्यान्वयन पर वापस आती है, जहां यह कुछ समझ में आता है - कम से कम सी 99 से पहले, जो माइक्रोसॉफ्ट अभी भी समर्थन नहीं करता है। (। मैं कि क्या माइक्रोसॉफ्ट के सी संकलक समर्थन _Bool
यहां तक कि अगर यह होता है, _Bool
int
से कुछ अर्थ मतभेद है पता नहीं है, और BOOL
की परिभाषा बदल रहा है कुछ कोड तोड़ सकता -। विशेष रूप से कोड GetMessage
का उपयोग करता है)
"idiomatic" से आपका क्या मतलब है? –
'बूल सी = (एक्स == गलत)'? :) – Inspired
यह एसओ के लिए शायद अनुचित है क्योंकि यह व्यक्तिगत स्वाद के लिए उबाल जाता है, मुझे विश्वास है। – lpapp