2012-05-17 12 views
9

में बूल को परिभाषित किया गया है तो मुझे कुछ कोड के साथ समस्याएं हैं जिन्हें मैंने विरासत में मिला है। यह कोड सी-केवल पर्यावरण में ठीक से निर्माण कर रहा था, लेकिन अब मुझे इस कोड को कॉल करने के लिए C++ का उपयोग करने की आवश्यकता है। हैडर problem.h शामिल हैं:जांचें कि मिश्रित सी/सी ++

#ifndef _BOOL 
typedef unsigned char bool; 
static const bool False = 0; 
static const bool True = 1; 
#endif 

struct astruct 
{ 
    bool myvar; 
    /* and a bunch more */ 
} 

जब मैं यह संकलन सी ++ कोड के रूप में, मैं error C2632: 'char' followed by 'bool' is illegal

मैं एक ही त्रुटि मिलती है अगर मैं extern "C" { ... } में #include "problem.h" (जो मुझे समझ नहीं आता लपेट, क्योंकि वहाँ होना चाहिए मिल जब सी के रूप में संकलन से कोई भी कीवर्ड bool हो)

मैं #ifndef _BOOL से #endif को ब्लॉक को हटाने, और सी ++ के रूप में संकलन करने की कोशिश की, और मैं त्रुटियों मिल:

error C2061: C requires that a struct or union has at least one member
error C2061: syntax error: identifier 'bool'

मैं बस समझ में नहीं कैसे सी ++ संकलक bool की एक नई परिभाषा के बारे में शिकायत कर रहा है, फिर भी जब मैं नई परिभाषा को हटा दें और सिर्फ bool उपयोग करने के लिए चर निर्धारित करने की कोशिश, यह कुछ भी नहीं मिल रहा है ।

किसी भी मदद की बहुत सराहना की जाती है।

+2

ध्यान दें कि 'बाहरी "सी" का मतलब "सी के रूप में संकलित नहीं है"। इसका मतलब है "सी लिंकेज के साथ संकलन"। अंदर कोड अभी भी सी ++ है, आपको बस कुछ भी परिभाषित करने की अनुमति नहीं है जिसे सी –

उत्तर

15

क्योंकि bool सी ++ (लेकिन सी में नहीं) में मूल प्रकार है, और इसे फिर से परिभाषित नहीं किया जा सकता है।

आप

#ifndef __cplusplus 
typedef unsigned char bool; 
static const bool False = 0; 
static const bool True = 1; 
#endif 
+0

दमनित के रूप में नहीं जोड़ा जा सकता है, आपने मुझे इसे हराया :) –

+1

लेकिन वह कोड सी 99 के 'stdbool.h' के साथ भी असंगत है, सावधान! –

+0

यह अभी भी 'char के बाद' बूल अवैध है 'के बारे में शिकायत कर रहा है, इसका मतलब है कि यह '_cplusplus' परिभाषित नहीं कर रहा है? – prelic

5

आप उपयोग कर सकते हैं के साथ अपने कोड के चारों ओर कर सकते हैं C99 के bool:

#ifndef __cplusplus 
#include <stdbool.h> 
#endif 

bool myBoolean; // bool is declared as either C99's _Bool, or C++'s bool data type. 

क्यों आप इस इस्तेमाल करना चाहिए?

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

+0

स्मृति में कुछ भी नहीं लेता है। क्या आप बाइट लिखना चाहते थे? –

+0

@ लचियनग्रिगोर नोप, मेरा मतलब थोड़ा सा था। बिट फ़ील्ड में देखें, जब एक स्ट्रक्चर में, बूल एक समान तरीके से पैक होते हैं। –

+0

मानक चार के आकार के अलावा आकार के कुछ भी नहीं कहता है। बाकी कार्यान्वयन परिभाषित किया गया है। मानक-अनुपालन कंपाइलर्स मौजूद हो सकते हैं जो एक बूल को स्टोर करने के लिए 1 एमबी का उपयोग करते हैं। –

1

आप __cplusplus मैक्रो का उपयोग करना चाहिए:

#ifndef __cplusplus 
#ifndef _BOOL 
typedef unsigned char bool; 
static const bool False = 0; 
static const bool True = 1; 
#endif 
#endif 

चेक बाहर अधिक जानकारी के लिए इस link to the C++ FAQ

-3

मेरे पास यह '' चार 'था जिसके बाद' बूल 'अवैध है "वीएस में भी समस्या है। मेरे लिए समस्या यह थी कि मैंने अर्ध-कॉलन के साथ अपनी कक्षा घोषणा समाप्त नहीं की थी- जिसे मैं इस मुद्दे की उम्मीद नहीं कर रहा था क्योंकि यह हेडर फ़ाइल में था और समस्या सीपीपी फ़ाइल में आ रही थी! उदाहरण:

class myClass 
{ 

}; // <-- put the semi colon !! 
+2

प्रश्न के रूप में 'बूल' से संबंधित कैसे है? –

+0

मुझे वीएस त्रुटि भी मिल रही थी जिसे "चार 'के प्रश्न में पोस्ट किया गया था, इसके बाद' बूल 'अवैध है" वीएस में - मेरे लिए तय वर्ग घोषणा के अंत में अर्ध कोलन जोड़ने के लिए था। –

+0

@ जस्टिन हिर्श विजुअल स्टूडियो एक आईडीई है, प्रोग्रामिंग भाषा नहीं। – cybermonkey

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