ত্রুটি: অজানা প্রকারের নাম 'বুল'


88

আমি উত্স কোডটি ডাউনলোড করেছি এবং স্ক্যানারের ফাইলটি সংকলন করতে চেয়েছিলাম। এটি এই ত্রুটি তৈরি করে:

এবং আমি এটি সংকলন করতে বিভিন্ন সংযোজক ব্যবহার করার চেষ্টা করেছি, তবে এটি বিভিন্ন ত্রুটি হিসাবে উপস্থিত হয়েছিল।

আমার ওএসটি 3.0-আর্চ, আমি জানি না কেন এটি ঘটেছিল। আমি কীভাবে ত্রুটি ঠিক করব?


12
#include <stdbool.h>
লেপি

উত্তর:


152

C90 বুলিয়ান ডেটা ধরণের সমর্থন করে না।

C99 এর সাথে এটি অন্তর্ভুক্ত রয়েছে:


48
C99 করে, যদি আপনার হয় #include <stdbool.h>
কিথ থম্পসন

4
সি 99 এর নেটিভ বুলিয়ান টাইপ রয়েছে _Bool<stdbool.h>হেডার একটি typedef জন্য এটা বলা উপলব্ধ boolসহ, trueএবং false
এমএম

4
আমি কীভাবে আমার বোল স্টাফবুলকে অন্তর্ভুক্ত না করে ওএসএক্সে সূক্ষ্ম উপাদানগুলি সংকলন করতে পারি?
ডেভিড 天宇 ওয়াং

আমি কিছু "সি" কোডও কপি-পেস্ট করেছি এবং উত্তর হিসাবে stbool.h অন্তর্ভুক্ত করে তাই gccসংকলিত হয়েছে। তবে মনে হচ্ছে সি ++ বুলিয়ানদের "বাক্সের বাইরে" জানেন তাই আমি g++কোডে কোনও পরিবর্তন না করে কেবল সংকলনের জন্য ব্যবহার করতে পারি । সুতরাং আপনার প্রসঙ্গ, কোডের উত্স এবং আরও ত্রুটিগুলির উপর নির্ভর করে আপনি সি নাও সি ++ কোডটি খুঁজছেন।
নুয়াল

55

C99 করে, যদি আপনার হয়

সংকলক যদি C99 সমর্থন করে না, আপনি নিজেরাই এটি সংজ্ঞায়িত করতে পারেন:

(তবে নোট করুন যে এই সংজ্ঞাটি এবিআই- র পরিবর্তনের জন্য boolটাইপ করা হয়েছে যাতে বাহ্যিক লাইব্রেরিগুলির সাথে সংযোগ স্থাপনের জন্য যা সঠিকভাবে সংজ্ঞায়িত করে সংকলিত ছিল boolরান-টাইমের ত্রুটিগুলি নির্ধারণ করতে পারে)।


39
আমার নিজের পছন্দসই পছন্দ করার উপায়টি boolহ'ল:typedef enum { false, true } bool;
কিথ থম্পসন

4
আপনি প্রয়োজন typedefহিসাবে টাইপ পড়ুন পাবে boolবদলে enum bool
কিথ থম্পসন

4
পরবর্তী উপায় অন্তর্নিহিত ঝুঁকিপূর্ণ কারণ এখানে কোনও অন্তর্নিহিত রূপান্তর নেই। উদাহরণস্বরূপ যদি আমাদের 16-বিট ইনট থাকে এবং long FLAG = 0x4000000; bool b = ( x & FLAG );তারপরে এটি অপরিজ্ঞাত আচরণের কারণ হয় (সম্ভবত ফলাফলটি পতাকা সেট bথাকলেও মিথ্যা বলে মনে হয় x)। যখন এটি boolকোনও ফাংশন প্যারামিটার হয় তখন এটি সনাক্ত করা শক্ত । ব্যবহার করুন, তবে যত্ন সহকারে ব্যবহার করুন।
এমএম

6
সাবধান! এটি প্রান্তের ক্ষেত্রে সত্যিকারের সি 99 বিলের মতোই আচরণ typedef করবে না , কারণ উভয়ই সত্যিকারের C99 বুলের দুটি মান রয়েছে তবে এটি typedefঅনেকগুলি সমর্থন intকরে, কারণ C99 boolএর বিশেষ কাস্টিং বিধি রয়েছে যা typedefনা। উদাহরণ: সি 99 এ, (bool)99999998430674944নির্বিঘ্নে true। আপনার সাথে typedef, আমার মেশিনে জিসিসিতে সংকলন করা (bool)99999998430674944হচ্ছে false(ingালাইয়ের সময় কীভাবে ওভারফ্লো হ্যান্ডল করা হয় তার কারণে)।
মার্ক আমেরিকা

4
@ কিথথম্পসন সংজ্ঞাটি এবিআইকে ভঙ্গ করে যদি আপনি বাইরের লাইব্রেরির সাথে লিঙ্ক করার চেষ্টা করেন যা সাধারণ বুলের সাথে সংকলিত হয়েছিল।
yugr


4

আপনার কোডে কোথাও একটি লাইন রয়েছে #include <string>। এটি নিজেই আপনাকে জানায় যে প্রোগ্রামটি সি ++ তে লেখা হয়েছে। সুতরাং ব্যবহার করার g++চেয়ে ভালgcc

অনুপস্থিত লাইব্রেরির জন্য: যদি আপনি কোনও ফাইল কল করতে পারেন তবে আপনার ফাইল সিস্টেমটি ঘুরে দেখার উচিত libl.so। ব্যবহার করুন locateকমান্ড চেষ্টা করুন, /usr/lib, /usr/local/lib, /opt/flex/lib, অথবা বলপূর্বক ব্যবহারfind / | grep /libl

একবার আপনি ফাইলটি সন্ধান করার পরে আপনাকে ডিরেক্টরিটি সংকলক কমান্ড লাইনে যুক্ত করতে হবে, উদাহরণস্বরূপ:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.