বুল কি দেশীয় সি টাইপ?


265

আমি লক্ষ করেছি যে লিনাক্স কার্নেল কোডটি বুল ব্যবহার করে তবে আমি ভেবেছিলাম যে বুল একটি সি ++ টাইপ ছিল। বুল কি একটি স্ট্যান্ডার্ড সি এক্সটেনশন (যেমন, আইএসও সি 90) বা জিসিসি এক্সটেনশন?


2
কমপ্লেক্স.এফ.এইউ.এইউ এর সেকশন 9 এ আলোচনা করে।
কিথ থমসন

1
সরাসরি লিঙ্ক: c-faq.com/bool/index.html
এলেন

লিনাক্স কার্নেল ব্যবহার করে -std=gnu89যা _BoolC90 এর এক্সটেনশন হিসাবে সমর্থন করে । "অন্তর্ভুক্ত / লিনাক্স / প্রকার typedef _Bool bool;। h" রয়েছে ।
ইয়ান অ্যাবট

এছাড়াও, এফডব্লিউআইডাব্লু, লিনাক্স কার্নেলটি 2.6.19 ব্যবহার করার জন্য প্রথম সংস্করণ ছিল typedef _Bool bool;( 6e21828743247270d09a86756a0c11702500dbfb কমিট করে ) এবং এটির জন্য জিএনইউ সি 3.2 বা তার পরে প্রয়োজন required
ইয়ান অ্যাবট

উত্তর:


368

bool বর্তমান সি - সি 99 এ বিদ্যমান, তবে সি 98/90 এ নেই।

C99-তে নেটিভ টাইপটি আসলে বলা হয় _Bool, যখন boolএটি একটি স্ট্যান্ডার্ড লাইব্রেরি ম্যাক্রোতে সংজ্ঞায়িত হয় stdbool.h(যা প্রত্যাশিতভাবে সমাধান হয় _Bool)। প্রকারের অবজেক্টগুলি _Bool0 বা 1 ধরে রাখে trueএবং falseএগুলি ম্যাক্রো থেকেও হয় stdbool.h

দ্রষ্টব্য, বিটিডাব্লু, এটি বোঝাচ্ছে যে সি প্রিপ্রসেসরটি অন্তর্ভুক্ত না করা #if trueহিসাবে ব্যাখ্যা করবে । এদিকে, সি ++ প্রিপ্রসেসরকে স্থানীয়ভাবে একটি ভাষা আক্ষরিক হিসাবে স্বীকৃতি দেওয়া প্রয়োজন ।#if 0stdbool.htrue


62
এটির একটি নতুন সি সি স্ট্যান্ডার্ড রয়েছে, যা ২০১১ সালে প্রকাশিত হয়েছিল (এই উত্তরটি পোস্ট করার পরে)। এএনএসআই যথারীতি আইএসও সি 11 স্ট্যান্ডার্ডকে এএনএসআই স্ট্যান্ডার্ড হিসাবে গ্রহণ করেছে। Historicalতিহাসিক কারণে, "এএনএসআই সি" শব্দটি সাধারণত এএনএসআই সি 89 / আইএসও সি 90 মান দ্বারা সংজ্ঞায়িত ভাষাটিকে বোঝায়। যেহেতু সি স্ট্যান্ডার্ডগুলি এখন আইএসও দ্বারা প্রকাশিত হয় এবং যেহেতু তিনটি আইএসও সি স্ট্যান্ডার্ড রয়েছে, বিভিন্ন ধরণের গ্রহণের ফলে, মানটি যে বছর প্রকাশিত হয়েছিল তা উল্লেখ করা ভাল (আইএসও সি 90, আইএসও সি 99, আইএসও সি 11) কোনও এড়ানোর জন্য বিহ্বলতায়।
কিথ থমসন

8
এর অর্থ কি _Bool1 বিট মেমরি নেয়?
জেরেমিয়া

27
@ জেরেমিয়া: না কেন? সিতে প্রতিটি ঠিকানাযোগ্য বস্তুর কমপক্ষে 1 বাইট দখল করতে হয়। এবং বাস্তব জীবনে বাস্তবায়ন _Boolসাধারণত মেমরির 1 বাইট নেয়। তবে, ভাষা স্পেসিফিকেশন স্পষ্টভাবে _Boolবিট-ফিল্ড প্রকার হিসাবে ব্যবহারের অনুমতি দেয় , যার অর্থ বিট-ক্ষেত্রগুলি ব্যবহার করে আপনি একটি _Boolমানটিকে একটি বিট (বৃহত্তর কাঠামোর অভ্যন্তরে) বার করতে পারেন।
এএনটি

@ অ্যান্ট কীভাবে কোনও _Boolমান উভয়ই সরাসরি সম্বোধনযোগ্য হতে পারে (অর্থাত্ মাপের 1 বাইট) এবং বিট- ফিল্ডেও অংশ নিতে পারে ? একটি অ্যারের _Boolএখনও তার সমস্ত উপাদানগুলির ঠিকানাযোগ্য (যেমন _Bool* ptr = &boolArray[123]) হওয়া দরকার require
দাই

118

C99 একটি বিল্টিন _Boolডেটা টাইপ যুক্ত করেছে ( বিশদগুলির জন্য উইকিপিডিয়া দেখুন), এবং যদি আপনি #include <stdbool.h>এটি boolম্যাক্রো হিসাবে সরবরাহ করেন _Bool

আপনি বিশেষত লিনাক্স কার্নেল সম্পর্কে জিজ্ঞাসা করেছিলেন। এটি উপস্থিতি অনুমান করে এবং অন্তর্ভুক্ত / লিনাক্স / প্রকারH এর মধ্যে _Boolএকটি টাইডেফ সরবরাহ করেbool


26
কেন এটি, এটি এটি অপরিজ্ঞাত এবং পুনরায় সংজ্ঞায়িত করার অনুমতি দেওয়া হবে যেখানে এর সংজ্ঞাটি উত্তরাধিকারের কোডের সাথে সংঘাতের কারণ হতে পারে।
ক্লিফোর্ড

32

না, boolআইএসও সি 90 এ নেই।

মানক সি (সি 99 নয়) এর কীওয়ার্ডগুলির একটি তালিকা এখানে রয়েছে:

  • auto
  • break
  • case
  • char
  • const
  • continue
  • default
  • do
  • double
  • else
  • enum
  • extern
  • float
  • for
  • goto
  • if
  • int
  • long
  • register
  • return
  • short
  • signed
  • static
  • struct
  • switch
  • typedef
  • union
  • unsigned
  • void
  • volatile
  • while

এখানে কার্নেল এবং স্ট্যান্ডার্ড হিসাবে ব্যবহৃত সি হিসাবে কিছু অন্যান্য পার্থক্য নিয়ে আলোচনা করা একটি নিবন্ধ : http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html


6
ব্যবহারিক উদ্দেশ্যগুলির জন্য, এখনও কোনও শালীন সংকলক সমর্থন না থাকায় এটি কি এতক্ষণ গুরুত্বপূর্ণ? এমনকি জিসিসি-তে সামান্য অবধি সি 99 এর অর্ধেক বৈশিষ্ট্য ছিল না, এবং এমএসভিসির মধ্যে বেশিরভাগটি নেই, এবং সম্ভবত কখনই হবে না ...
পাভেল মিনায়েভ

5
@ জোনাথন লেফলার, প্রশ্নকারী বিশেষত আইএসও সি 90 সম্পর্কে জিজ্ঞাসা করেছিলেন। :) প্রকৃতপক্ষে, সাধারণত যখন লোকেরা এএনএসআই সি উল্লেখ করে তারা সি 90 মেকান করে। আমি সি 99 ব্যবহার করার জন্য বা সত্যই পরিকল্পনা করি না এবং আমি মনে করি অনেকেই একইরকম অনুভব করেন।
ববিশ্যাফটোয়

6
@ ববিশ্যাফটো: মূল পোস্টার স্পষ্ট করে একটি মন্তব্যে বলেছিল যে সি 90 একটি উদাহরণ ছিল।
কিথ থমসন 21

32

C99 এর এটি stdbool.h এ রয়েছে তবে C90 এ এটি টাইপডেফ বা এনুম হিসাবে সংজ্ঞায়িত করা উচিত:

typedef int bool;
#define TRUE  1
#define FALSE 0

bool f = FALSE;
if (f) { ... }

বিকল্পভাবে:

typedef enum { FALSE, TRUE } boolean;

boolean b = FALSE;
if (b) { ... }

5
মনে রাখবেন যে টাইপডিফের আচরণটি C99 এর চেয়ে boolআলাদা এবং অনেক সংকলকের bitপ্রকারের থেকেও আলাদা হবে । উদাহরণস্বরূপ, bool x=4294967296LL;বা C99 এ bool x=0.1;সেট xকরা হবে তবে সম্ভবত বেশিরভাগ টাইপইফ সংস্করণ শূন্যে সেট করা যাবে।
সুপারক্যাট

17
/* Many years ago, when the earth was still cooling, we used this: */

typedef enum
{
    false = ( 1 == 0 ),
    true = ( ! false )
} bool;

/* It has always worked for me. */

16
প্রাথমিক মানগুলি সম্পূর্ণ অপ্রয়োজনীয়। typedef enum { false, true };ঠিক যেমন ভাল। আপনি আরও সুস্পষ্ট হওয়ার জন্য জোর দিলে লিখতে পারেন typedef enum { false = 0, true = 1 };। (বা ঠিক #include <stdbool.h>যদি আপনার সংকলক এটি সমর্থন করে; এটি 14 বছরের জন্য প্রমিত))
কিথ থম্পসন

9
@ কিথথম্পসন প্রাথমিক মানগুলি অপ্রয়োজনীয় হতে পারে তবে এই উত্তরটি তাদেরকে খুব মার্জিত উপায়ে বেছে নেয়, স্বেচ্ছাচারিত মানগুলির সাথে নয়, তবে ভাষার নিজস্ব শব্দার্থক ব্যবহার করে এবং সংকলককে সিদ্ধান্ত নিতে দেয়।
MestreLion

11
@ মাস্টারলিয়ন: ভাষার নিজস্ব শব্দার্থবিজ্ঞান গ্যারান্টি যা typedef enum { false, true } bool;প্রত্যাশার মতো ঠিক কাজ করে। 1 == 0এবং ! falseমার্জিত নয়, তারা নিছক নিরস্ত। সংকলক করার সিদ্ধান্ত নেই; এটি অবশ্যই ভাষা দ্বারা সংজ্ঞায়িত শব্দার্থবিজ্ঞান মেনে চলতে হবে।
কিথ থম্পসন

11
@ কিথথম্পসন: আমি মনে করি না যে সেগুলি অবরুদ্ধ, আমি অনুমান করি যে লেখকের উদ্দেশ্য সর্বাধিক "প্রাকৃতিক" মানগুলি বেছে নেওয়ার ছিল: falseভাষা যে অসাম্যকে মূল্যায়ন করতে হবে এবং trueযেটির "বিপরীতে" সেটাকে সেট করা উচিত সেটাকে নির্ধারণ করে ( আবার, যা কিছু)। এটি যদি {1, 0}, {-1, 0}, {0, 1} ইত্যাদি হয় সেদিকে নজর দেওয়া উচিত নয় এবং এটি তুলনা করে কাজ করার গ্যারান্টিযুক্ত কারণ এটি একটি ব্যবহার করে তৈরি করা হয়েছিল ।
MestreLion

3
@MestreLion: যেকেউ কে জানে C- এর সাংখ্যিক মান জানে falseএবং true। যে কেউ সি জানে না সে সি কোডের জন্য প্রত্যাশিত শ্রোতা নয়। এবং যেমনটি আমি বলেছিলাম, সি এর সহস্রাব্দ থেকে বুলেটিয়ান টাইপ একটি বিল্ট-ইন ছিল।
কিথ থম্পসন

12

_Boolসি 99 এর একটি কীওয়ার্ড: এটি ঠিক যেমন intবা তেমন কোনও প্রকার নির্দিষ্ট করে double

6.5.2

2 টাইপ _বুল হিসাবে ঘোষিত একটি অবজেক্ট 0 এবং 1 এর মান সংরক্ষণ করার জন্য যথেষ্ট বড়।




1

stdbool.h ম্যাক্রোগুলিকে সত্য এবং মিথ্যা সংজ্ঞা দেয় তবে মনে রাখবেন এটি 1 এবং 0 হতে সংজ্ঞায়িত হয়েছে।

সে কারণেই sizeof(true)4।


0

এরকম কোনও জিনিস নেই, সম্ভবত কেবলমাত্র ম্যাক্রো ইনট জন্য


-1 এর সাথে চমৎকার ... প্রশ্নটি সি 90, আমি বিশ্বাস করি না 99
সিন্ড্রে জে

5
ভাল তিনি সি স্ট্যান্ডার্ড যেমন C90 বলেছেন , আমি ধরে নিই যে C99 রয়েছে।
ম্যাট জয়েনার

2
তিনি C90 উল্লেখ করে C90 উল্লেখ করেছেন, তাই আমি ধরে নিলাম যে তার অর্থ কি। উইকিপিডিয়া অনুসারে একমাত্র সংকলক যা সি 99 কে পুরোপুরি সমর্থন করে তা হ'ল সান মাইক্রোসিস্টেমগুলি থেকে সান স্টুডিও। এখন, এটি একটি প্রশস্ত স্বীকৃত স্ট্যান্ডার্ডই কি? যুক্তিযুক্তভাবে বেশিরভাগ আধুনিক সংকলকগুলি C99 স্ট্যান্ডার্ডের কিছু অংশ প্রয়োগ করে, সম্ভবত আমার উল্লেখ করা উচিত ছিল যে আপনার মতো বোকা মন্তব্য এড়ানোর জন্য! জাভা বা সি # এই বিটিডব্লু দিয়ে কি করতে হবে?
সিন্ড্রে জে

8
স্ট্যান্ডার্ড সি এক্সটেনশন (উদাহরণস্বরূপ, আইএসও সি 90) তিনি যে ধরণের সি স্ট্যান্ডার্ডে আগ্রহী সেটির শ্রেণিবদ্ধ করছে, বিশেষত সি 90 নয়। এর যথাযথ উত্তর হ্যাঁ , হ্যাঁ সি সি স্ট্যান্ডার্ড যেমন সি 90, বিশেষত সি 99 স্ট্যান্ডার্ড কোনও ধরণের প্রয়োগ করেbool
ম্যাট জয়েনার

0

C99 একটি boolপ্রকার যুক্ত করেছে যার শব্দার্থকগুলি সি এর পূর্বে বিদ্যমান সমস্ত পূর্ণসংখ্যার ধরণের থেকে মৌলিকভাবে পৃথক, যেমন ব্যবহারকারীর দ্বারা সংজ্ঞায়িত এবং সংকলক-এক্সটেনশন প্রকারগুলি এই জাতীয় উদ্দেশ্যে, এবং যা কিছু প্রোগ্রামগুলিতে "টাইপ-ডিএফ" এড থাকতে পারে to bool

উদাহরণস্বরূপ, প্রদত্ত bool a = 0.1, b=2, c=255, d=256;, C99 boolপ্রকারটি চারটি অবজেক্টকে 1 এ সেট typedef unsigned char boolকরে। এটি ব্যবহার করা charহলে মানগুলি উপরের মতো cহতে পারে বা -1 হতে পারে। যদি এটি একটি সংকলক-এক্সটেনশন bitবা __bitপ্রকারটি ব্যবহার করে থাকে তবে ফলাফলগুলি 0, 0, 1, 0 হতে পারে ( bitআকার 1 এর স্বাক্ষরযুক্ত বিট-ফিল্ডের সমতুল্য উপায়ে বা একটি মান বিটের সাথে স্বাক্ষরবিহীন পূর্ণসংখ্যার টাইপ)।

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