त्रुटि: अज्ञात प्रकार का नाम 'बूल'


86

मैंने स्रोत कोड डाउनलोड किया और स्कैनर की फाइल संकलित करना चाहता था। यह इस त्रुटि का उत्पादन करता है:

[meepo@localhost cs143-pp1]$ gcc -o lex.yy.o lex.yy.c -ll
In file included from scanner.l:15:0:
scanner.h:59:5: error: unknown type name ‘bool’
In file included from scanner.l:16:0:
utility.h:64:38: error: unknown type name ‘bool’
utility.h:74:1: error: unknown type name ‘bool’
In file included from scanner.l:17:0:
errors.h:16:18: fatal error: string: No such file or directory
compilation terminated.

और मैंने इसे संकलित करने के लिए अलग-अलग उपयोग करने की कोशिश की, लेकिन यह अलग-अलग त्रुटियों में दिखाई दिया।

[meepo@localhost cs143-pp1]$ g++ -o scan lex.yy.c -ll
/usr/bin/ld: cannot find -ll
collect2: ld returned 1 exit status

मेरा ओएस 3.0-ARCH है, मुझे नहीं पता कि ऐसा क्यों हुआ। मैं त्रुटि कैसे ठीक करूं?


12
#include <stdbool.h>
लेप्पी

जवाबों:


146

C90 बूलियन डेटा प्रकार का समर्थन नहीं करता है।

C99 इसमें इसे शामिल करता है:

#include <stdbool.h>

48
C99 करता है, अगर आपके पास है #include <stdbool.h>
कीथ थॉम्पसन

1
C99 में एक देशी बूलियन प्रकार कहा जाता है _Bool<stdbool.h>हैडर एक typedef के लिए यह कहा जाता है प्रदान करता है boolके साथ साथ, trueऔर false
MM

1
कैसे मैं OSX पर अपने बूल के सामान को संकलित कर सकता हूं बिना stdbool.h को शामिल किए?
डेविड David वोंग

मैंने कुछ "C" कोड को कॉपी-पेस्ट किया है और साथ ही यह भी कहा है कि stbool.h को gccसंकलित करना शामिल है । हालांकि लगता है कि C ++ को बूलियन "बॉक्स से बाहर" पता है, इसलिए मैं g++कोड में किसी भी बदलाव के बिना संकलन के लिए उपयोग कर सकता हूं । इसलिए आपके संदर्भ के आधार पर, कोड का स्रोत और आगे की त्रुटियां शायद आप c लेकिन c ++ कोड को नहीं देख रहे हैं।
nuala

55

C99 करता है, अगर आपके पास है

#include <stdbool.h> 

यदि कंपाइलर C99 का समर्थन नहीं करता है, तो आप इसे स्वयं परिभाषित कर सकते हैं:

// file : myboolean.h
#ifndef MYBOOLEAN_H
#define MYBOOLEAN_H

#define false 0
#define true 1
typedef int bool; // or #define bool int

#endif

(लेकिन ध्यान दें कि यह परिभाषा एबीआई को बदल देती है, boolइसलिए बाहरी पुस्तकालयों के खिलाफ लिंक करने के लिए जो ठीक से परिभाषित के साथ संकलित किया गया था bool, हार्ड-टू-डायग्नोज रनटाइम त्रुटियों का कारण हो सकता है)।


39
परिभाषित करने boolका मेरा अपना पसंदीदा तरीका है:typedef enum { false, true } bool;
कीथ थॉम्पसन

2
आपको इसके बजाय typedefटाइप करने के लिए संदर्भित करने में सक्षम होने की आवश्यकता boolहै enum bool
कीथ थॉम्पसन

3
बाद का तरीका स्वाभाविक रूप से जोखिम भरा है क्योंकि इसमें कोई अंतर्निहित रूपांतरण नहीं है। उदाहरण के लिए यदि हमारे पास 16-बिट इनट्स हैं और long FLAG = 0x4000000; bool b = ( x & FLAG );फिर यह अपरिभाषित व्यवहार का कारण बनता है (संभावित परिणाम के साथ जो ध्वज सेट bहोने पर भी गलत प्रतीत होगा x)। जब boolएक फंक्शन पैरामीटर होता है, तो इसे स्पॉट करना कठिन होता है। उपयोग करें, लेकिन देखभाल के साथ उपयोग करें।
एमएम

6
सावधान रहें! यह किनारे के मामलों में एक सच्चे C99 बूल के रूप में एक ही व्यवहार typedef नहीं करेगा , क्योंकि दोनों एक सच्चे C99 बूल में केवल दो मान हैं, लेकिन यह typedefउतना intही समर्थन करता है, लेकिन यह भी क्योंकि C99 boolमें विशेष कास्टिंग नियम हैं जो typedefऐसा नहीं करता है। उदाहरण: C99 में, (bool)99999998430674944स्पष्ट रूप से है true। आपके साथ typedef, मेरी मशीन पर जीसीसी में संकलन, (bool)99999998430674944है false(कास्टिंग करते समय कैसे अतिप्रवाह संभाला जाता है)।
मार्क एमी

1
@KeithThompson इस तरह की परिभाषा ABI को तोड़ती है यदि आप बाहरी पुस्तकालय के साथ लिंक करने का प्रयास करते हैं जो सामान्य बूल के साथ संकलित किया गया था।
युगर


4

कहीं आपके कोड में एक पंक्ति है #include <string>। यह स्वयं आपको बताता है कि प्रोग्राम C ++ में लिखा गया है। इसलिए उपयोग g++करना बेहतर है gcc

अनुपलब्ध लाइब्रेरी के लिए: आपको फ़ाइल सिस्टम में चारों ओर देखना चाहिए, यदि आप एक फ़ाइल कह सकते हैं libl.so। का प्रयोग करें locateआदेश की कोशिश, /usr/lib, /usr/local/lib, /opt/flex/lib, या जानवर-बल का प्रयोग find / | grep /libl

एक बार फ़ाइल मिल जाने के बाद, आपको निर्देशिका को कंपाइलर कमांड लाइन में जोड़ना होगा, उदाहरण के लिए:

g++ -o scan lex.yy.c -L/opt/flex/lib -ll
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.