<cstdint> বনাম <stdint.h>


97

মধ্যে পার্থক্য কি stdint.hএবং cstdint?

এগুলি উভয়ই এমএসভিসি (ভিজ্যুয়াল স্টুডিও 2010) এবং জিসিসি-4.5। এছাড়াও উভয়ই intX_t/ uintX_tপ্রকারগুলি সংজ্ঞায়িত করে (যেখানে Xধরণের বাইটের আকার রয়েছে)।

  • উভয় শিরোনামে যুক্তি যদি একই (পোর্টেবল প্রকারের) হয় তবে একটি বা অন্যের বিষয়ে সিদ্ধান্ত নেওয়ার জন্য আমাকে কোন সিদ্ধান্ত নিতে হবে?

stdint.hকোন নামস্থান ছাড়া প্রতিটি টাইপ সংজ্ঞায়িত cstdintধরনের মিথ্যা stdনামস্থান।

  • নাম স্থানে সংজ্ঞায়িত প্রকারগুলি অন্তর্ভুক্ত করার বা না যুক্ত করার কি কোনও কারণ আছে std? দুটি শিরোলেখের মধ্যে কী আলাদা?

cstdintকোনও ফাইল এক্সটেনশন নেই এবং cপ্রিফিক্স stdint.hব্যবহার করে, .hএক্সটেনশনটি ব্যবহার করে ।

  • এই শিরোলেখগুলির জন্য নামকরণের সম্মেলনগুলি কী কী? cউপসর্গ নির্দেশ করে যে এটি C লাইব্রেরি কি? ফাইল এক্সটেনশনের অভাবের কারণ আছে cstdint?

ওএস এক্স 10.8 এর অভাব রয়েছে <cstdint>। এখানে ত্রুটি আমি পাই আছে: ./misc.h:7:10: fatal error: 'cstdint' file not found
jww

উত্তর:


124

সি ++ 98 এর আসল উদ্দেশ্যটি হ'ল <cstdint>গ্লোবাল নেমস্পেসকে দূষিত করা এড়াতে আপনার সি ++ ব্যবহার করা উচিত (ভাল, <cstdint>বিশেষত নয়, এটি কেবল সি ++ 11 এ যুক্ত করা হয়েছে তবে <c*>সাধারণভাবে শিরোনাম)।

যাইহোক, বাস্তবায়নগুলি যেভাবেই হোক বিশ্বব্যাপী নেমস্পেসে প্রতীকগুলি রাখার পক্ষে অব্যাহত ছিল এবং সি ++ 11 এই অনুশীলনকে অনুমোদন দিয়েছে [*]। সুতরাং, আপনার কাছে মূলত তিনটি বিকল্প রয়েছে:

  • ব্যবহারের <cstdint>এবং হয় সম্পূর্ণরূপে প্রতিটি পূর্ণসংখ্যা টাইপ যোগ্যতা অর্জন আপনি ব্যবহার বা অন্য সুযোগ সেটিকে জিনিস আপনাকে এনে using std::int32_t;ইত্যাদি (কারণ বাগাড়ম্বরপূর্ণ বিরক্তিকর, কিন্তু এটা শুধু সি অন্য কোন প্রতীক ++ স্ট্যান্ডার্ডের লাইব্রেরির জন্য মত করার অধিকার পথ)
  • ব্যবহার <stdint.h>(কিছুটা খারাপ কারণ হ্রাস করা হয়েছে)
  • ব্যবহার করুন <cstdint>এবং ধরে নিন আপনার বাস্তবায়নটি বিশ্বব্যাপী নেমস্পেসে চিহ্নগুলি রাখবে (গ্যারান্টিযুক্ত না হওয়ায় খুব খারাপ)।

অনুশীলনে আমি সন্দেহ করি যে একটি বিরক্তিকর বিপুল পরিমাণ কোড শেষ বিকল্পটি ব্যবহার করে, কেবলমাত্র এমন কারণে যে দুর্ঘটনাক্রমে এমন কার্যকর করা সম্ভব হয় যেখানে <cstdint>বিশ্বব্যাপী নেমস্পেসে চিহ্নগুলি রাখে। আপনার প্রথমটি ব্যবহার করার চেষ্টা করা উচিত। দ্বিতীয়টির একটি গুণ রয়েছে, এটি কেবলমাত্র এটি করার পরিবর্তে বিশ্বব্যাপী নেমস্পেসে স্টাফ রাখার গ্যারান্টিযুক্ত । আমি মনে করি না যে এটি বিশেষভাবে দরকারী, তবে এটি যদি আপনার অগ্রাধিকার হয় তবে এটি কিছু টাইপ করতে পারে।

এখানে একটি চতুর্থ বিকল্প রয়েছে যার #include <cstdint>পরে using namespace std;কখনও কখনও কার্যকর হয় তবে এমন জায়গাগুলি রয়েছে যা আপনার রাখা উচিত নয় using namespace std;। সেই জায়গাগুলি যেখানে রয়েছে সেখানে বিভিন্ন লোকের বিভিন্ন ধারণা থাকতে পারে তবে "একটি শীর্ষস্থানীয় ফাইলে শীর্ষ স্তরের" "সিপিপি ফাইলের শীর্ষ স্তরের" থেকেও খারাপ, যা "সীমিত সুযোগে" এর চেয়েও খারাপ। কিছু লোক একেবারেই লেখেন না using namespace std;

[*] এর অর্থ সি ++ স্ট্যান্ডার্ড শিরোনামগুলিকে বিশ্বব্যাপী নেমস্পেসে স্টাফ রাখার অনুমতি দেওয়া হলেও এটির প্রয়োজন নেই। সুতরাং আপনাকে এই চিহ্নগুলির সাথে সংঘর্ষ এড়াতে হবে, তবে আপনি আসলে সেগুলি ব্যবহার করতে পারবেন না কারণ সেগুলি সেখানে নাও থাকতে পারে। মূলত, সি ++ এর বিশ্বব্যাপী নেমস্পেস একটি খনি ক্ষেত্র, এটি এড়াতে চেষ্টা করুন। কেউ তর্ক করতে পারে যে কমিটি বাস্তবায়নের মাধ্যমে একটি অনুশীলনকে অনুমোদন দিয়েছে যা using namespace std;শিরোনামের ফাইলে শীর্ষ স্তরের উপর চাপানো প্রায় ক্ষতিকারক - পার্থক্য হ'ল বাস্তবায়নগুলি কেবল সি স্ট্যান্ডার্ড লাইব্রেরিতে চিহ্নগুলির জন্যই কাজ করে, যেখানে using namespace std;এটি সি ++ এর জন্য করে শুধুমাত্র একক চিহ্ন। সি স্ট্যান্ডার্ডে একটি বিভাগ রয়েছে যা ভবিষ্যতে স্ট্যান্ডার্ডগুলিতে সংযোজনগুলির জন্য সংরক্ষিত নাম তালিকাভুক্ত করে। এই নামগুলিও C ++ বিশ্বব্যাপী নেমস্পেসে সংরক্ষিত হিসাবে বিবেচনা করা সম্পূর্ণ বোকামি ধারণা নয়, তবে এটি প্রয়োজনীয় নয়।


একমাত্র উত্তর না দেওয়া প্রশ্নটি শিরোনাম ফাইলগুলির নামকরণের কনভেনশন সম্পর্কে, আপনি কি এই বিষয় সম্পর্কে জানেন?
পেপারবার্ডমাস্টার

24
@PaperBirdMaster: C ++ স্ট্যান্ডার্ডের গ্রন্থাগার হেডার ফাইল এক্সটেনশন হবে না: <iostream>, <vector>, <cstdlib>, পৃথক্ সি সামঞ্জস্য জন্য অন্তর্ভুক্ত বেশী থেকে: <stdint.h>, <stdlib.h>। এবং হ্যাঁ, প্রাথমিক cইঙ্গিত করে যে <cstdlib>সি ++ এর সি মান শিরোনামের সমতূল্য <stdlib.h>, বরং বিলকুল সি নতুন হচ্ছে ++, মত চেয়ে <vector>আছে। একটি সি ++ শিরোলেখ রয়েছে <complex>, সুতরাং আমাদের কেবলমাত্র আশা করতে হবে যে সি এর ভবিষ্যতের কোনও সংস্করণ কোনও মানক শিরোলেখের পরিচয় দেয় না <omplex.h>
স্টিভ জেসোপ

@ স্টিভ জেসোপ এর্ম, সি 99?
এসএস অ্যানি

4
@ জেএল 2210 লক্ষ্য করুন যে তিনি বলেছেন <omplex.h>, না <complex.h>। সি যুক্ত করা হলে <omplex.h>, সি ++ সমতুল্য হবে <complex>
জন Leuenhagen

16

cstdintস্ট্যান্ডার্ড নেমস্পেসে এবং সম্ভবত গ্লোবাল নেমস্পেসে প্রতীক নামগুলি আমদানি সহ । বিশ্বব্যাপী নেমস্পেসে এবং সম্ভবত স্ট্যান্ড নেমস্পেসে প্রতীক নামগুলি আমদানি
সহ ।stdint.h

সি স্ট্যান্ডার্ড লাইব্রেরিতে সি স্ট্যান্ডার্ড লাইব্রেরির বৈশিষ্ট্যগুলিও সরবরাহ করা হয় এবং একটি সাধারণ নামকরণের কনভেনশন হিসাবে সেগুলি সি স্ট্যান্ডার্ড লাইব্রেরিতে সংশ্লিষ্ট নামের সাথে সি-পেন্ড করে থাকে।

সি ++ এ আপনার ব্যবহার করা উচিত:

#include <cstdint>

এবং std::
সি থাকা অবস্থায় আপনি যে প্রতীক নামগুলি ব্যবহার করেন তা পুরোপুরি যোগ্যতা অর্জন করুন, আপনার ব্যবহার করা উচিত:

#include <stdint.h>

সংযুক্তি ডি (আদর্শগত) সামঞ্জস্য বৈশিষ্ট্যগুলি [অবদানকারী] বলেছেন:

ডি .6 সি স্ট্যান্ডার্ড লাইব্রেরি শিরোনাম

1 সি স্ট্যান্ডার্ড লাইব্রেরি এবং সি ইউনিকোড টিআরের সাথে সামঞ্জস্যের জন্য, সি ++ স্ট্যান্ডার্ড লাইব্রেরি 25 সি হেডার সরবরাহ করে, যেমন সারণী 151 তে দেখানো হয়েছে।

কোনটি অন্তর্ভুক্ত:

<assert.h> <float.h> <math.h> <stddef.h> <tgmath.h> <complex.h> <inttypes.h> <setjmp.h> <stdio.h> <time.h> <ctype.h> <iso646.h> <signal.h> <stdint.h> <uchar.h> <errno.h> <limits.h> <stdarg.h> <stdlib.h> <wchar.h> <fenv.h> <locale.h> <stdbool.h> <string.h> <wctype.h>

এবং আরও,

2 প্রতিটি সি শিরোনাম, যার প্রত্যেকটিরই ফর্মের একটি নাম রয়েছে name.h, এমন আচরণ করে যাতে প্রমিত লাইব্রেরির নামপত্রে সংশ্লিষ্ট প্রতিটি নামটি cname headerবিশ্বব্যাপী নেমস্পেসের স্কোপের মধ্যে স্থাপন করা হয়। এই নামগুলি প্রথমে নেমস্পেসের স্ট্যান্ডের নেমস্পেস স্কোপ (৩.৩. within) এর মধ্যে ঘোষিত বা সংজ্ঞায়িত করা হয়েছে এবং তারপরে সুস্পষ্টভাবে ব্যবহারের মাধ্যমে ঘোষণাপত্র (.3.৩.৩) দ্বারা গ্লোবাল নেমস্পেস স্কোপে ইনজেকশন দেওয়া আছে কিনা তা অনির্ধারিত ified

3 [উদাহরণ: শিরোনাম <cstdlib>অবশ্যই স্ট্যান্ডার্ড নেমস্পেসের মধ্যে এর ঘোষণা এবং সংজ্ঞা প্রদান করে। এটি বিশ্বব্যাপী নেমস্পেসের মধ্যে এই নামগুলি সরবরাহ করতে পারে। শিরোনাম <stdlib.h>নিশ্চিতভাবে গ্লোবাল নেমস্পেসের মধ্যে একই ঘোষণা এবং সংজ্ঞা প্রদান করে, অনেকটা সি স্ট্যান্ডার্ডের মতো। এটি স্ট্যান্ডার্ড নেমস্পেসের মধ্যে এই নামগুলি সরবরাহ করতে পারে। পরবর্তী উদাহরণ]


-1
  1. cstdintC ++ 11 শিরোনাম, stdint.hC99 শিরোনাম (সি এবং সি ++ বিভিন্ন ভাষা!)

  2. MSVC 2008 তন্ন তন্ন রয়েছে stdint.hকিংবা cstdint

  3. এর প্রয়োগগুলি cstdintবেশিরভাগ ক্ষেত্রে কেবল #include <stdint.h>কিছু নেমস্পেস / ভাষার সংশোধন সহ।


4
3. ভুল। cstdintনেমস্পেসে বাস্তবায়নগুলি উত্তোলন করা দরকার std
কনরাড রুডলফ

4
১. ভুলটিও, stdint.h সি ++ স্ট্যান্ডার্ডের আদর্শিক আনেক্সেক্স ডি-তে সি ++ লাইব্রেরির অংশ হিসাবে সংজ্ঞায়িত করা হয়েছে।
ঠান্ডা

@ চিল, আপনি দয়া করে এনেক্স ডি-এর লিঙ্ক সরবরাহ করতে পারেন? এখানে en.cppreferences.com/w/cpp/tyype/integer বলেছেন যে C ++ 11 শিরোনাম।
ইঞ্জিন

4
@ نفرت-ইঞ্জিন, আমি আপনাকে সি ++ স্ট্যান্ডার্ডের অনুলিপিটিতে সন্ধান করার পরামর্শ দিচ্ছি। যে cppreferences পৃষ্ঠা উল্লেখ নেই stdint.hcstdintসি ++ শিরোনাম এমন কোনও যুক্তি নেই ।
ঠাণ্ডা

4
১ এর কোনও অংশ মিথ্যা নয়, এটি একসাথে নেওয়া দেখে মনে হচ্ছে আপনি বলছেন stdint.hযে সি ++ 11 এর অংশ নয়। আসলে এটি সি ++ 11 দ্বারা প্রয়োজনীয়। আপনি বলতে পারেন, " intC ++ 11 এ রয়েছে; longC99 এ রয়েছে; C এবং C ++ বিভিন্ন ভাষা!" এবং এর কোনও অংশই মিথ্যা হবে না। আমার উদাহরণ আরও বেশি বিভ্রান্তিকর করা হয়েছে, অথচ, যেহেতু সি ++ 11 C99 অংশ বোঝায় উভয় বিষয়বস্তু নির্ধারণ করতে stdint.hএবং cstdintকিন্তু সংজ্ঞায়িত করতে সি বোঝায় না int
স্টিভ জেসোপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.