কেবল ফাংশন ওভারলোডিংয়ের জন্য কোনও সি ++ সংকলক ব্যবহার করা কি খারাপ অভ্যাস?


60

সুতরাং আমি একটি নির্দিষ্ট প্রসেসরের জন্য সি ব্যবহার করে একটি সফ্টওয়্যার ডিজাইনে কাজ করছি। টুল-কিটে সি-র পাশাপাশি সি ++ সংকলন করার ক্ষমতা অন্তর্ভুক্ত রয়েছে। আমি যা করছি তার জন্য, এই পরিবেশে কোনও গতিশীল মেমরি বরাদ্দ নেই এবং প্রোগ্রামটি মোটামুটি সহজ। ডিভাইসের প্রায় কোনও প্রসেসরের শক্তি বা সংস্থান নেই তা উল্লেখ করার দরকার নেই। সত্যিই যে কোনও সি ++ ব্যবহার করার জোরালো প্রয়োজন নেই।

বলা হচ্ছে, কয়েকটি জায়গা আছে যেখানে আমি ফাংশন ওভারলোডিং করি (সি ++ এর একটি বৈশিষ্ট্য)। আমাকে কয়েকটি বিভিন্ন ধরণের ডেটা প্রেরণ করা দরকার এবং printfকোনও ধরণের %s(বা যাই হোক না কেন) যুক্তি দিয়ে স্টাইল বিন্যাস ব্যবহার করার মতো মনে হয় না । আমি কিছু লোককে দেখেছি যাদের কাজটি করতে সি ++ কম্পাইলারের অ্যাক্সেস নেই printf, তবে আমার ক্ষেত্রে সি ++ সমর্থন উপলব্ধ।

এখন আমি নিশ্চিত যে আমি কেন একটি ফাংশন শুরু করার জন্য ওভারলোডের প্রয়োজন তা আমি পেতে পারি। সুতরাং আমি এখনই উত্তর দেওয়ার চেষ্টা করব। আমাকে সিরিয়াল পোর্টের বাইরে বিভিন্ন ধরণের ডেটা প্রেরণ করতে হবে যাতে আমার কয়েকটি ওভারলোড থাকে যা নিম্নলিখিত ডেটা ধরণের প্রেরণ করে:

unsigned char*
const char*
unsigned char
const char

আমি কেবল এমন একটি পদ্ধতি না রাখাই পছন্দ করব যাতে এই সমস্ত জিনিস পরিচালিত হয়। আমি যখন ফাংশন আমি এটা সিরিয়াল পোর্ট আউট প্রেরণ করতে চান তার উপর কল, আমি সম্পদ অনেক তাই আমি সবে করতে না চান না কিছু কিন্তু আমার সংক্রমণ।

অন্য কেউ আমার প্রোগ্রাম দেখে আমাকে জিজ্ঞাসা করলেন, "আপনি সিপিপি ফাইল ব্যবহার করছেন কেন?" সুতরাং, এটি আমার একমাত্র কারণ। এটা কি খারাপ অভ্যাস?

হালনাগাদ

আমি জিজ্ঞাসা করা কিছু প্রশ্ন সম্বোধন করতে চাই:

আপনার দ্বিধাদ্বন্ধের একটি উদ্দেশ্য উত্তর নির্ভর করবে:

  1. আপনি যদি সি ++ ব্যবহার করেন তবে এক্সিকিউটেবলের আকারটি উল্লেখযোগ্যভাবে বৃদ্ধি পায় কিনা।

এই মুহূর্তে এক্সিকিউটেবলের আকার প্রোগ্রাম মেমরির 4.0% (5248 বাইটের মধ্যে) এবং ডেটা মেমরির 8.3% (342 বাইটের মধ্যে) গ্রাস করে। এটি হ'ল সি ++ এর জন্য সংকলন করা ... আমি জানি না এটি সিটির মতো দেখতে কেমন হবে কারণ আমি সি সংকলকটি ব্যবহার করি নি। আমি জানি যে এই প্রোগ্রামটি আর বাড়বে না, সুতরাং সংস্থানগুলির কতটা সীমাবদ্ধতার জন্য আমি বলতে পারি যে আমি ঠিক আছি ...

  1. যদি আপনি সি ++ ব্যবহার করেন তবে পারফরম্যান্সে কোনও লক্ষণীয় নেতিবাচক প্রভাব রয়েছে কিনা।

আচ্ছা যদি সেখানে থাকে তবে আমি কিছুই লক্ষ্য করি নি ... তবে তারপরেও আবার কারণ হতে পারে যেহেতু আমি এই প্রশ্নটি পুরোপুরি বুঝতে পারছি না।

  1. কোডটি অন্য কোনও প্ল্যাটফর্মে পুনরায় ব্যবহার করা যেতে পারে যেখানে কেবলমাত্র একটি সি সংকলক উপলব্ধ।

আমি জানি যে এর উত্তর অবশ্যই নেই । আমরা আসলে অন্য একটি প্রসেসরের দিকে যাওয়ার বিষয়টি বিবেচনা করছি, তবে কেবলমাত্র আরও শক্তিশালী এআরএম-ভিত্তিক প্রসেসর (যে সমস্তটির জন্য আমি জানি একটি সি ++ সংকলক সরঞ্জাম-চেইন রয়েছে)।


59
আমি কেবলমাত্র সি বৈশিষ্ট্যগুলি ব্যবহার করে কোনও প্রকল্পের জন্য সি ++ ব্যবহার করতে পারি যাতে আমি //মন্তব্য করতে পারি । যদি এটি কাজ করে তবে কেন নয়?
জুলু

76
খারাপ অভ্যাসটি নিজেকে সিটিতে সীমাবদ্ধ রাখবে যখন আপনি যে বৈশিষ্ট্যগুলি সরবরাহ করে না তার জন্য এটির ভাল ব্যবহার রয়েছে।
জেরি কফিন

35
আপনি যখন "একটি সি ++ সংকলক ব্যবহার করুন" বলবেন তখন আপনার অর্থ "সি ++ ব্যবহার করুন"। শুধু এটা বল. আপনি সি কে সি ++ কম্পাইলারের সাহায্যে সংকলন করতে পারবেন না, তবে আপনি সি থেকে সি ++ তে সহজেই স্যুইচ করতে পারেন, যা আপনি আসলে যা করছেন তা।
ব্যবহারকারী 253751

4
"আমি যা করছি তার জন্য, প্রসেসরের উপর কোনও গতিশীল মেমরি বরাদ্দ নেই এবং প্রোগ্রামটি মোটামুটি সহজ the আমি আশা করি যে এই দুটি বাক্যগুলির মধ্যে প্রথমটি সি ++ ব্যবহার না করার কারণ বলে মনে করা হচ্ছে কারণ তারা যদি খুব খারাপ হয় তবে তা হয়। এমবেডেড সিস্টেমগুলির সাথে ব্যবহার করতে সি ++ পুরোপুরি ঠিক।
ফারাপ

21
@ জুলস আমি নিশ্চিত যে আপনি এটি জানেন এবং কিছুক্ষণের জন্য আবার চিন্তাভাবনা করেছিলেন, তবে কেউ যদি এটি পড়েন না: //মন্তব্যগুলি সি 99 এর পরে সি স্ট্যান্ডার্ডে রয়েছে।
ডেভিস্লোর

উত্তর:


77

আমি এটিকে "খারাপ অনুশীলন" প্রতি সে হিসাবে বলতে যাব না , তবে আমিও নিশ্চিত নই যে এটিই আপনার সমস্যার সঠিক সমাধান। আপনার চারটি ডেটা টাইপ করার জন্য যদি আপনি যা চান তার জন্য সমস্ত চারটি আলাদা ফাংশন হয়, কেন সি প্রোগ্রামাররা অনাদিকাল থেকে যা করে নি:

void transmit_uchar_buffer(unsigned char *buffer);
void transmit_char_buffer(char *buffer);
void transmit_uchar(unsigned char c);
void transmit_char(char c);

এটি কার্যকরভাবে সি ++ সংকলক যেভাবেই পর্দার পিছনে কাজ করছে এবং এটি প্রোগ্রামারটির পক্ষে কোনও ওভারহেডের বড় নয়। "আপনি কেন একটি সি ++ কম্পাইলার দিয়ে যথেষ্ট-সি লিখছেন না" এর সমস্ত সমস্যা এড়ানো যায় এবং এর অর্থ আপনার প্রকল্পের অন্য কেউ বিভ্রান্ত হতে পারে না যার দ্বারা সি ++ এর বিটগুলি "অনুমোদিত" এবং কোন বিটগুলি নেই।


8
আমি বলব না কেন কারণ প্রেরণ করা হচ্ছে টাইপটি (সম্ভবত) একটি বাস্তবায়নের বিশদ, তাই এটি লুকিয়ে রাখা এবং বাস্তবায়ন নির্বাচনের ক্ষেত্রে সংকলককে আরও কার্যকরভাবে পাঠযোগ্য কোডের ফলাফল দেয়। এবং যদি সি ++ বৈশিষ্ট্যটি ব্যবহারযোগ্যতা পঠনযোগ্যতার উন্নতি করে তবে তা কেন করবেন না?
জুলু

29
আবার এও পারেন #defineপ্রেরণ () C11 ব্যবহার_Generic
Deduplicator

16
@ জুলেস কারণ এটি তখন প্রকল্পটিতে সি ++ বৈশিষ্ট্যগুলি কী ব্যবহার করার অনুমতি দেয় তা নিয়ে খুব বিভ্রান্তি রয়েছে। বস্তুযুক্ত একটি সম্ভাব্য পরিবর্তন প্রত্যাখ্যান করা হবে? টেম্পলেট সম্পর্কে কি? সি ++ স্টাইলের মন্তব্য? অবশ্যই, আপনি কোডিং স্টাইল ডকুমেন্ট দিয়ে এটিকে ঘিরে কাজ করতে পারেন, তবে আপনি যদি সমস্ত কিছু করছেন ফাংশন ওভারলোডিংয়ের একটি সাধারণ ক্ষেত্রে, তবে কেবল পরিবর্তে সি লিখুন write
ফিলিপ কেন্ডল

25
@ ফিলিপ "সি ++ স্টাইলের মন্তব্য" এক দশকেরও বেশি সময় ধরে কার্যকর ছিল।
ডেভিড কনরাড

12
@ জুলেস: প্রকারটি প্রেরণ করা সম্ভবত সফ্টওয়্যারগুলির জন্য একটি বাস্তবায়ন বিশদ যা বীমা কোট তৈরি করে, ওপিএস অ্যাপ্লিকেশনটি একটি এম্বেডড সিস্টেম বলে মনে হচ্ছে সিরিয়াল যোগাযোগ, যেখানে টাইপ এবং ডেটাসাইজ উল্লেখযোগ্য গুরুত্ব বহন করে।
21:57

55

অন্যথায় একে সি হিসাবে চিকিত্সা করার সময় কেবলমাত্র সি ++ এর কয়েকটি বৈশিষ্ট্য ব্যবহার করা ঠিক সাধারণ নয়, তবে একেবারে একেবারে শোনাও যায় না। প্রকৃতপক্ষে, কিছু লোক এমনকি কঠোর এবং আরও শক্তিশালী ধরণের চেকিং ব্যতীত সি ++ এর সমস্তগুলিতে কোনও বৈশিষ্ট্যই ব্যবহার করেন না । তারা কেবল সি লিখেন (কেবলমাত্র সি ++ এবং সি এর সাধারণ ছেদটিতে লিখতে যত্ন নেওয়া), তারপরে টাইপ পরীক্ষার জন্য সি ++ সংকলক এবং কোড উত্পন্নকরণের জন্য একটি সি সংকলক (বা কেবল পুরোপুরি সি ++ সংকলকটি আঁকিয়ে রাখুন) দিয়ে সংকলন করুন।

লিনাক্স একটি কোডবেসের একটি উদাহরণ যেখানে লোকেরা নিয়মিত জিজ্ঞাসা করে যে শনাক্তকারীদের classনাম বদলে দেওয়া klassবা kclassযাতে তারা সি ++ সংকলক দিয়ে লিনাক্স সংকলন করতে পারে। একথাও ঠিক যে, সি ++ দেওয়া লিনাস মতামত , তারা সবসময় নিচে গুলি পেতে "সি ++ - পরিষ্কার সি" :-D জিসিসি একটি কোডবেস যে প্রথম রুপান্তরিত হয়েছিল একটি উদাহরণ, এবং তারপর ধীরে ধীরে আরো সি ++ বৈশিষ্ট্য ব্যবহারের রি-ফ্যাক্টর।

আপনি যা করছেন তাতে কোনও ভুল নেই। আপনি যদি আপনার সি ++ কম্পাইলারের কোড প্রজন্মের গুণমান সম্পর্কে সত্যই বেহাল হয়ে থাকেন তবে আপনি কমোউ সি ++ এর মতো একটি সংকলক ব্যবহার করতে পারেন, যা সিটিকে তার লক্ষ্য ভাষা হিসাবে সংকলন করে এবং তারপরে সি সংকলকটি ব্যবহার করতে পারে। এই পদ্ধতিতে, আপনি সি ++ ব্যবহার করে কোনও অপ্রত্যাশিত পারফরম্যান্স-সংবেদনশীল কোড ইনজেকশন দেয় কিনা তা দেখতে কোডের স্পট তদন্তও করতে পারেন। কেবল ওভারলোডিংয়ের ক্ষেত্রে এটি হওয়া উচিত নয়, যদিও আক্ষরিকভাবে কেবল স্বয়ংক্রিয়ভাবে আলাদা আলাদা নামযুক্ত ফাংশন তৈরি করা হচ্ছে - আইওডাব্লু, আপনি যেভাবেই সিতে যাচ্ছেন ঠিক তাই।


15

আপনার দ্বিধাদ্বন্ধের একটি উদ্দেশ্য উত্তর নির্ভর করবে:

  1. আপনি যদি সি ++ ব্যবহার করেন তবে এক্সিকিউটেবলের আকারটি উল্লেখযোগ্যভাবে বৃদ্ধি পায় কিনা।
  2. যদি আপনি সি ++ ব্যবহার করেন তবে পারফরম্যান্সে কোনও লক্ষণীয় নেতিবাচক প্রভাব রয়েছে কিনা।
  3. কোডটি অন্য কোনও প্ল্যাটফর্মে পুনরায় ব্যবহার করা যেতে পারে যেখানে কেবলমাত্র একটি সি সংকলক উপলব্ধ।

যদি কোনও প্রশ্নের উত্তর "হ্যাঁ" হয়, আপনি বিভিন্ন ডেটা ধরণের জন্য আলাদা আলাদা নামকরণ করা এবং সি এর সাথে লেগে থাকা থেকে ভাল be

সমস্ত প্রশ্নের উত্তর যদি "না" হয় তবে আপনার সি ++ ব্যবহার করা উচিত নয় এমন কোনও কারণ আমি দেখতে পাচ্ছি না।


9
আমার অবশ্যই বলতে হবে যে আমি কখনও কোনও সি ++ সংকলকের মুখোমুখি হইনি যে দুটি ভাষার ভাগ করা সাবসেটে লিখিত কোডের জন্য সি সংকলকটির চেয়ে উল্লেখযোগ্যভাবে খারাপ কোড উত্পন্ন করে। সি ++ সংকলক উভয় আকার এবং পারফরম্যান্সের জন্য খারাপ প্রতিক্রিয়া পান, তবে আমার অভিজ্ঞতা হ'ল সি ++ বৈশিষ্ট্যগুলির বরাবরই অনুপযুক্ত ব্যবহার যা সমস্যার কারণ হয়ে দাঁড়িয়েছে ... বিশেষত, আপনি যদি আকার সম্পর্কে উদ্বিগ্ন হন তবে আইওস্ট্রিম ব্যবহার করবেন না এবং ব্যবহার করবেন না টেমপ্লেট, তবে অন্যথায় আপনার ভাল হওয়া উচিত।
জুলু

@ জুলেস: এটির মূল্যের জন্য (খুব বেশি নয়, আইএমও) আমি দেখেছি যে সি এবং সি ++ (টার্বো সি ++ 1.0, মেমরি যদি দেয় তবে) একক সংকলক হিসাবে যা বিক্রি হয়েছিল তা অভিন্ন ইনপুটটির জন্য উল্লেখযোগ্যভাবে পৃথক ফলাফল আনতে পারে। আমি এটি বুঝতে পেরেছি, তবে এটি তাদের নিজস্ব সি ++ সংকলক শেষ করার আগেই ছিল, সুতরাং এটি বাইরের একটি সংকলকের মতো দেখতে হলেও এটিতে দুটি সম্পূর্ণ পৃথক সংকলক ছিল - একটি সি এর জন্য, অন্যটি সি ++ এর জন্য।
জেরি কফিন

1
@ জেরি কফিন যদি মেমোরিটি দেয় তবে টার্বো পণ্যগুলির কখনও সুনাম হয় নি। এবং যদি এটি একটি 1.0 সংস্করণ হয় তবে আপনি উচ্চ পরিশোধিত না হওয়ার জন্য ক্ষমা করতে পারেন। সুতরাং এটি খুব প্রতিনিধি না।
বার্মার

10
@ বার্মার: আসলে, বেশ কিছুদিন ধরে তাদের বেশ ভাল খ্যাতি ছিল। তাদের দুর্বল খ্যাতি প্রাথমিকভাবে তাদের নিছক বয়সের কারণে। তারা একই মেশিনের অন্যান্য সংকলকগুলির সাথে প্রতিযোগিতামূলক - তবে জিসিসি 1.4 (বা যাই হোক না কেন) দিয়ে কীভাবে জিনিসগুলি করা যায় সে সম্পর্কে কেউ প্রশ্ন পোস্ট করে না। তবে আপনি ঠিক বলেছেন - এটি খুব প্রতিনিধি নয়।
জেরি কফিন

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

13

আপনি প্রশ্নটি এমনভাবে মনে করছেন যেন সি ++ দিয়ে সংকলন করা আপনাকে আরও বৈশিষ্ট্যগুলিতে অ্যাক্সেস দেয়। এই ক্ষেত্রে না হয়. একটি সি ++ কম্পাইলারের সাথে সংকলনের অর্থ হল আপনার উত্স কোডটি সি ++ উত্স হিসাবে ব্যাখ্যা করা হয়েছে এবং সি ++ সি থেকে আলাদা একটি ভাষা useful দুটিরই একটি সাধারণ উপসেট রয়েছে যাতে কার্যকরীভাবে প্রোগ্রাম করতে পারে তবে প্রতিটিটির বৈশিষ্ট্য রয়েছে যা অন্যটির অভাবযুক্ত এবং এটি উভয় ভাষায় গ্রহণযোগ্য তবে ভিন্নভাবে ব্যাখ্যা করা কোড লিখতে সম্ভব।

যদি সত্যিই আপনি চান সমস্ত হ'ল ফাংশন ওভারলোডিং, তবে আমি সত্যিই এটিতে সি ++ এনে সমস্যাটি বিভ্রান্ত করার বিষয়টি দেখতে পাচ্ছি না। একই নামের বিভিন্ন ফাংশনের পরিবর্তে তাদের পরামিতি তালিকাগুলি আলাদা করে নিন, কেবল বিভিন্ন নামের সাথে ফাংশন লিখুন।

আপনার উদ্দেশ্য মানদণ্ড হিসাবে,

  1. আপনি যদি সি ++ ব্যবহার করেন তবে এক্সিকিউটেবলের আকারটি উল্লেখযোগ্যভাবে বৃদ্ধি পায় কিনা।

যেমন নির্ধারিত সি কোডের তুলনায় সি ++ হিসাবে সংকলন করা হলে এক্সিকিউটেবলটি কিছুটা বড় হতে পারে। সর্বনিম্ন, সি ++ এক্সিকিউটেবলের সমস্ত ক্রিয়াকলাপের নামগুলির জন্য সি ++ নাম-ম্যাঙ্গলিংয়ের সন্দেহজনক সুবিধা থাকবে যতক্ষণ না কোনও এক্সিকিউটেবলের মধ্যে কোনও চিহ্ন বহাল থাকে। (এবং এটি আসলে আপনার ওভারলোডকে প্রথম স্থানে সরবরাহ করে।) পার্থক্যটি আপনার পক্ষে গুরুত্বপূর্ণ হওয়ার পক্ষে যথেষ্ট কিনা তা আপনাকে পরীক্ষার মাধ্যমে নির্ধারণ করতে হবে।

  1. যদি আপনি সি ++ ব্যবহার করেন তবে পারফরম্যান্সে কোনও লক্ষণীয় নেতিবাচক প্রভাব রয়েছে কিনা।

আমার সন্দেহ যে আপনি যে কোডটি বর্ণনা করেছেন তার জন্য একটি পারফরম্যান্স পারফরম্যান্স পার্থক্য দেখতে পাবেন বনাম একটি অনুমানিক বিশুদ্ধ-সি অ্যানালগ।

  1. কোডটি অন্য কোনও প্ল্যাটফর্মে পুনরায় ব্যবহার করা যেতে পারে যেখানে কেবলমাত্র একটি সি সংকলক উপলব্ধ।

আমি এটিতে কিছুটা আলাদা আলো ছুঁড়ে দেব: আপনি যে কোডটি তৈরি করছেন সেটি যদি আপনি সি ++ দিয়ে অন্য কোডের সাথে যুক্ত করতে চান তবে অন্য কোডটিও সি ++ এ লেখা এবং সি ++ দিয়ে তৈরি করা প্রয়োজন, অথবা আপনার প্রয়োজন হবে আপনার নিজস্ব কোডে ("সি" লিংকেজ ঘোষণা করে) বিশেষ বিধান করার জন্য, যা অতিরিক্তভাবে, আপনি আপনার অতিরিক্ত লোড ফাংশনগুলির জন্য মোটেই করতে পারবেন না। অন্যদিকে, যদি আপনার কোড সিতে লেখা হয় এবং সি হিসাবে সংকলিত হয়, তবে অন্যরা এটি সি এবং সি ++ উভয় মডিউলগুলির সাথে লিঙ্ক করতে পারে। এই ধরণের সমস্যাটি সাধারণত টেবিলগুলি ঘুরিয়ে কাটিয়ে উঠতে পারে, তবে যেহেতু আপনার সত্যিই সি ++ প্রয়োজন নেই বলে মনে হচ্ছে তবে কেন এই জাতীয় সমস্যাটিকে প্রথমে গ্রহণ করবেন?


4
"সি ++ হিসাবে সংকলন করা হলে নির্বাহী কিছুটা বড় হতে পারে ... নির্বাহযোগ্য ক্ষেত্রে যে কোনও চিহ্ন বহাল থাকে তার পরিমাণে" " ন্যায়সঙ্গত হওয়ার জন্য, যে কোনও শালীন অপ্টিমাইজিং টুলচেনের "রিলিজ" বিল্ডগুলিতে এই চিহ্নগুলি ফেলার জন্য একটি লিঙ্কার বিকল্প থাকা উচিত, যার অর্থ তারা কেবল আপনার ডিবাগিং বিল্ডগুলিকেই ফুটিয়ে তুলবে। আমি মনে করি না যে এটি একটি বড় ক্ষতি। প্রকৃতপক্ষে, এটি প্রায়শই একটি সুবিধা।
কোডি গ্রে

5

আগের দিন, "আরও ভাল সি" হিসাবে একটি সি ++ সংকলক ব্যবহারের ক্ষেত্রে ব্যবহার হিসাবে প্রচারিত হয়েছিল । আসলে, প্রথম দিকের সি ++ ঠিক সেটাই ছিল। অন্তর্নিহিত ডিজাইনের নীতিটি হ'ল আপনি কেবল সেই বৈশিষ্ট্যগুলিই ব্যবহার করতে পারেন যা আপনি চান এবং যে বৈশিষ্ট্যগুলি আপনি ব্যবহার করছেন না তার জন্য ব্যয় করতে হবে না। সুতরাং, আপনি ক্রিয়াকলাপগুলি ওভারলোড করতে পারেন ( overloadকীওয়ার্ডের মাধ্যমে অভিপ্রায়টি ঘোষণার মাধ্যমে !) এবং আপনার প্রকল্পের বাকিগুলি কেবল কেবল সূক্ষ্ম সংকলন করবে না তবে সি সংকলকটি উত্পাদন করার চেয়ে খারাপ কোনও কোড উত্পন্ন করবে।

সেই থেকে ভাষা কিছুটা সরে গেছে।

mallocআপনার সি কোডের প্রত্যেকটিই এক ধরণের অমিল ত্রুটি হবে - আপনার ক্ষেত্রে কোনও গতিশীল মেমরির সমস্যা নেই! তেমনি, voidসিতে আপনার সমস্ত পয়েন্টার আপনাকে ট্রিপ করবে, কারণ আপনাকে স্পষ্ট বর্ণবাদী যুক্ত করতে হবে। তবে… আপনি কেন সেভাবে করছেন … আপনি আরও বেশি করে সি ++ বৈশিষ্ট্য ব্যবহারের পথে পরিচালিত হবেন।

সুতরাং, কিছু অতিরিক্ত কাজ দিয়ে এটি সম্ভব হতে পারে। তবে এটি বৃহত্তর স্কেল +++ গ্রহণের প্রবেশদ্বার হিসাবে পরিবেশন করবে। কয়েক বছরের মধ্যে লোকেরা আপনার লিগ্যাসি কোড সম্পর্কে অভিযোগ করবে যা দেখে মনে হয় এটি 1989 সালে লেখা হয়েছিল, কারণ তারা আপনার mallocকলগুলি প্রতিস্থাপন করার সাথে সাথে newকেবল একটি অ্যালগরিদম কল করার জন্য লুপ বডিগুলির কোডের ব্লকগুলি ছিঁড়ে ফেলবে এবং অনিরাপদ জাল পলিমারফিজমকে বেঁধে দেবে সংকলকটি এটি করার অনুমতি দিলে তুচ্ছ ছিল।

অন্যদিকে, আপনি জানেন যে আপনি এটি সিতে লিখে থাকলে এটি একইরকম হতে পারে, সুতরাং C ++ এর অস্তিত্বের পরিবর্তে সিটিতে লেখা কি কখনও ভুল হয়? যদি উত্তরটি "না" হয় তবে সি ++ থেকে চেরি-নেওয়া বৈশিষ্ট্যগুলি ব্যবহার করাও ভুল হতে পারে না


2

অনেক প্রোগ্রামিং ভাষার একটি বা একাধিক সংস্কৃতি থাকে যা তাদের চারপাশে বিকশিত হয় এবং কোনও ভাষা "কী" হওয়ার কথা তা সম্পর্কে বিশেষ ধারণা রয়েছে। যদিও এটি সিস্টেম, প্রোগ্রামিংয়ের জন্য নিম্ন-স্তরের ভাষার জন্য উপযুক্ত, ব্যবহারযোগ্য এবং দরকারী হওয়া উচিত যা সি ++ এর কিছু বৈশিষ্ট্য যেমন একইভাবে উপযোগী হতে পারে সেই জাতীয় উদ্দেশ্যে সি এর একটি উপভাষাকে বাড়িয়ে তোলে, তবে দুটি ভাষার আশেপাশের সংস্কৃতি ' বিশেষত এই জাতীয় সংযোজনের পক্ষে নয়।

আমি এমন একটি এম্বেডেড সি সংকলক পড়েছি যার সক্ষমতা সহ সি ++ থেকে কিছু বৈশিষ্ট্য অন্তর্ভুক্ত করা হয়েছে

foo.someFunction(a,b,c);

মূলত হিসাবে ব্যাখ্যা করা

typeOfFoo_someFunction(foo, a, b, c);

পাশাপাশি স্থিতিশীল ফাংশনগুলি ওভারলোড করার ক্ষমতা ( রফতানি হলে কেবল নামকরণের সমস্যাগুলি উত্থাপিত হয়)ফাংশনগুলি ওভারলোড হয়)। লিঙ্কিং এবং রান-টাইম পরিবেশের জন্য কোনও অতিরিক্ত প্রয়োজনীয়তা চাপিয়ে না দিয়ে সি সংকলনকারীরা এই জাতীয় কার্যকারিতা সমর্থন করতে সক্ষম হবেন না এমন কোনও কারণ নেই, তবে পরিবেশগত বোঝা এড়ানোর স্বার্থে অনেকগুলি সি কম্পাইলারের সি ++ থেকে প্রায় সমস্ত কিছুকে প্রত্যাখ্যানযোগ্য প্রত্যাখ্যান করে তোলে এমন কোনও বৈশিষ্ট্যও প্রত্যাখ্যান করুন যা এ জাতীয় কোনও ব্যয় চাপায় না। এদিকে, সি ++ এর সংস্কৃতি এমন কোনও পরিবেশের জন্য খুব কম আগ্রহ দেখায় যা সেই ভাষার সমস্ত বৈশিষ্ট্য সমর্থন করতে পারে না। সি সংস্কৃতি যেমন বৈশিষ্ট্যগুলি গ্রহণ না করে বা হালকা ওজনের উপগ্রহগুলির বাস্তবায়নকে উত্সাহিত করার জন্য সি ++ এর সংস্কৃতি পরিবর্তন না করা পর্যন্ত "হাইব্রিড" কোড উভয় ভাষার সীমাবদ্ধতার অনেকটা ভোগ করতে সক্ষম, যখন ফসল কাটার ক্ষমতাকে সীমাবদ্ধ থাকবে? সম্মিলিত সুপারসেটে পরিচালনা করার সুবিধা।

যদি কোনও প্ল্যাটফর্ম সি এবং সি উভয়কেই সমর্থন করে তবে সি ++ সমর্থন করার জন্য প্রয়োজনীয় অতিরিক্ত গ্রন্থাগার কোডটি কার্যকরভাবে কিছুটা বড় করে তুলবে, যদিও এর প্রভাব বিশেষভাবে দুর্দান্ত হবে না। সি ++ এর মধ্যে "সি বৈশিষ্ট্যগুলি" কার্যকর করা সম্ভবত বিশেষভাবে প্রভাবিত হবে না। আরও বড় সমস্যা হতে পারে সি এবং সি ++ অপ্টিমাইজার কীভাবে বিভিন্ন কোণার কেসগুলি পরিচালনা করে। সি তে ডেটা ধরণের আচরণ বেশিরভাগই এতে সঞ্চিত বিটের বিষয়বস্তু দ্বারা সংজ্ঞায়িত হয় এবং সি ++ এর কাঠামোর একটি স্বীকৃত বিভাগ রয়েছে (পিওডিএস - সমতল পুরাতন ডেটা স্ট্রাকচার) যার শব্দার্থবিজ্ঞান একইভাবে বেশিরভাগ সঞ্চিত বিট দ্বারা সংজ্ঞায়িত করা হয়। সি এবং সি ++ স্ট্যান্ডার্ড উভয়ই কখনও কখনও সঞ্চিত বিট দ্বারা উল্লিখিত বিপরীত আচরণের অনুমতি দেয় এবং "সঞ্চিত-বিট" আচরণের ব্যতিক্রম দুটি ভাষার মধ্যে পৃথক হয়।


1
আকর্ষণীয় মতামত তবে ওপি-র প্রশ্নের সমাধান করে না।
আর সাহু

@ আরসাহু: কোনও ভাষার চারপাশে "সংস্কৃতি" ফিট করে এমন কোডটি কোডের চেয়ে অনেকগুলি বেশি কার্যকর এবং সহজেই বিভিন্ন প্রয়োগের সাথে মানিয়ে নিতে উপযুক্ত pt সি এবং সি ++ এর সংস্কৃতি উভয়ই ওপি পরামর্শ দেয় যে ধরণের ব্যবহারের বিরুদ্ধে, আমি নির্দিষ্ট প্রশ্নগুলির সাথে আরও কিছু নির্দিষ্ট পয়েন্ট যুক্ত করব।
সুপারক্যাট

1
নোট করুন যে সি ++ স্ট্যান্ডার্ড কমিটিতে একটি এম্বেডড / আর্থিক / গেমিং গ্রুপ রয়েছে যা আপনার দাবি করা "সামান্য আগ্রহ" পরিস্থিতি বাতিল করার মতো ধরণের সমস্যা সমাধানের লক্ষ্যে।
ইয়াক

@ ইয়াক্ক: আমি স্বীকার করব যে আমি সি ++ বিশ্বকে খুব কাছ থেকে অনুসরণ করিনি, যেহেতু আমার আগ্রহগুলি মূলত সি এর সাথে থাকে; আমি জানি যে আরও এম্বেড থাকা উপভাষার দিকে চেষ্টা করা হয়েছে তবে আমি ভাবিনি যে এগুলি সত্যিই কোথাও পেয়েছে।
সুপারক্যাট

2

আরেকটি গুরুত্বপূর্ণ বিষয় বিবেচনা করতে হবে: যে কেউ আপনার কোডটির উত্তরাধিকারী হবে।

সেই ব্যক্তিটি কি সর্বদা সি সংকলক সহ সি প্রোগ্রামার হতে চলেছেন? আমারও তাই মনে হচ্ছে.

সেই ব্যক্তিও কি সি ++ সংকলক সহ সি ++ প্রোগ্রামার হবেন? আমার কোডটি সি ++ নির্দিষ্ট জিনিসের উপর নির্ভরশীল করার আগে আমি এই বিষয়ে যুক্তিসঙ্গতভাবে নিশ্চিত হতে চাই।


2

পলিমারফিজম এমন একটি দুর্দান্ত বৈশিষ্ট্য যা সি ++ বিনামূল্যে সরবরাহ করে। তবে, সংকলক চয়ন করার সময় আপনার অন্যান্য দিকগুলি বিবেচনা করতে হবে consider সিতে পলিমারফিজমের বিকল্প রয়েছে তবে এর ব্যবহারের ফলে কিছু উত্থিত ভ্রু হতে পারে। এটির ভ্যারিয়্যাডিক ফাংশন, দয়া করে ভারিয়াদিক ফাংশন টিউটোরিয়ালটি দেখুন

আপনার ক্ষেত্রে এটি কিছু হবে

enum serialDataTypes
{
 INT =0,
 INT_P =1,
 ....
 }Arg_type_t;
....
....
void transmit(Arg_type_t serial_data_type, ...)
{
  va_list args;
  va_start(args, serial_data_type);

  switch(serial_data_type)
  {
    case INT: 
    //Send integer
    break;

    case INT_P:
    //Send data at integer pointer
    break;
    ...
   }
 va_end(args);
}

আমি ফিলিপস পদ্ধতির পছন্দ করি তবে এটি আপনার লাইব্রেরিতে প্রচুর কল দিয়ে লিটার করে দেয়। উপরের সাথে ইন্টারফেসটি পরিষ্কার is এটির এর অসুবিধাগুলি রয়েছে এবং শেষ পর্যন্ত এটি পছন্দের বিষয়।


ভারিয়াদিক ফাংশনগুলি প্রাথমিকভাবে ব্যবহারের ক্ষেত্রে পরিবেশন করে যেখানে আর্গুমেন্টের সংখ্যা এবং তাদের ধরণের উভয়ই পরিবর্তনশীল। অন্যথায়, আপনার এটির দরকার নেই এবং বিশেষত এটি আপনার নির্দিষ্ট উদাহরণের জন্য অতিমাত্রার চেয়ে বেশি। এটি একটি সাধারণ ফাংশন ব্যবহার করা সহজ হবে যা কোনও Arg_type_tএবং void *ডেটারে নির্দেশক গ্রহণ করে। এর সাথে হ্যাঁ, (একক) ফাংশনটিকে এমন একটি যুক্তি প্রদান করা যা ডেটা টাইপকে নির্দেশ করে সত্যই একটি কার্যকর বিকল্প।
জন বলিঞ্জার

1

কিছু ভিন্ন ধরণের জন্য স্ট্যাটিকালি কোনও "ফাংশন" ওভারলোড করার ক্ষেত্রে আপনার বিশেষ ক্ষেত্রে, আপনি এর পরিবর্তে কেবল _Genericম্যাক্রো যন্ত্রপাতি দিয়ে সি 11 ব্যবহার করার বিষয়টি বিবেচনা করতে পারেন । আমি মনে করি এটি আপনার সীমিত প্রয়োজনের জন্য যথেষ্ট হতে পারে।

ফিলিপ কেন্ডালের উত্তর ব্যবহার করে আপনি সংজ্ঞা দিতে পারেন:

#define transmit(X) _Generic((X),      \
   unsigned char*: transmit_uchar_buffer, \
   char*: transmit_char_buffer,           \
   unsigned char: transmit_uchar,         \
   char: transmit_char) ((X))

এবং কোড ( transmit(foo) যা fooউপরে তালিকাভুক্ত চার ধরণের মধ্যে রয়েছে) এর যে কোনও ধরণেরই হোক code

আপনি শুধুমাত্র যত্নশীল তাহলে জিসিসি (এবং সামঞ্জস্যপূর্ণ, যেমন ঝনঝন ) কম্পাইলার, আপনি তার বিবেচনা করতে পারে __builtin_types_compatible_pwtth তার typeofএক্সটেনশান।


1

কেবল ফাংশন ওভারলোডিংয়ের জন্য কোনও সি ++ সংকলক ব্যবহার করা কি খারাপ অভ্যাস?

আইএমএইচও-র অবস্থান, হ্যাঁ, এবং আমি এর উত্তরটির জন্য আমাকে সিজোফ্রেনিক হতে হবে যেহেতু আমি উভয় ভাষা পছন্দ করি তবে এর দক্ষতার সাথে কিছুই করার নেই, তবে ভাষা এবং সুরক্ষার মতো ভাষা ব্যবহারের মতো।

সি সাইড

একটি সি দৃষ্টিকোণ থেকে, আমি আপনার কোডটি কেবল ফাংশন ওভারলোডিং ব্যবহারের জন্য সি ++ প্রয়োজন তা আপনার পক্ষে এটি অপচয় করার মতো মনে হয়। আপনি যদি এটি সি ++ টেমপ্লেটগুলির সাথে স্ট্যাটিক পলিমারফিজমের জন্য ব্যবহার না করেন তবে সম্পূর্ণরূপে ভিন্ন ভাষায় স্যুইচ করার বিনিময়ে এ জাতীয় তুচ্ছ সিনট্যাকটিকাল চিনি অর্জন করা। আরও যদি আপনি কখনও কোনও ডিলিবের কাছে আপনার ফাংশনগুলি রফতানি করতে চান (তবে এটি ব্যবহারিক উদ্বেগ নাও থাকতে পারে), আপনি নাম নামক চিহ্নযুক্ত সমস্ত চিহ্ন সহ বিস্তৃত ব্যবহারের জন্য আর ব্যবহারিকভাবে এত তাড়াতাড়ি করতে পারবেন না।

সি ++ সাইড

একটি সি ++ অবস্থান থেকে, আপনি ফাংশন ওভারলোডিংয়ের সাথে সি এর মতো সি ++ ব্যবহার করবেন না। এটি স্টাইলিস্টিক কৌতুকবাদ নয় বরং এটি প্রতিদিনের সি ++ এর ব্যবহারিক ব্যবহারের সাথে সম্পর্কিত।

আপনার সাধারণ ধরণের সি কোডটি কেবল যুক্তিসঙ্গতভাবে বুদ্ধিমান এবং "নিরাপদ" লিখতে হবে যদি আপনি সি টাইপ সিস্টেমের বিরুদ্ধে কাজ করছেন যা অনুলিপি করণকারীগুলির মতো জিনিসগুলিকে নিষিদ্ধ করে structs। আপনি একবার সি ++ এর অনেক বেশি সমৃদ্ধ টাইপ সিস্টেমে কাজ করার পরে, প্রতিদিনের ফাংশনগুলি যা প্রচুর পরিমাণে মূল্যবান হয় memsetএবং memcpyফাংশনগুলিতে পরিণত হয় না তা আপনাকে সর্বদা ঝুঁকতে হবে। পরিবর্তে, এগুলি এমন ক্রিয়াকলাপ যা আপনি সাধারণত প্লেগের মতো এড়াতে চান, যেহেতু সি ++ প্রকারের মাধ্যমে, আপনি কাঁচা বিট এবং বাইটগুলির মতো অনুলিপি করা এবং চারপাশে এলোমেলো এবং মুক্ত হওয়া উচিত নয়। এমনকি যদি আপনার কোডটি memsetএই মুহুর্তে কেবলমাত্র আদিম এবং পিওডি ইউডিটির মতো জিনিস ব্যবহার করে তবে যে মুহুর্তে আপনার ব্যবহার করা কোনও ইউডিটিতে কোনও সিটার যুক্ত করা হয় (যেমন কোনও সদস্যের প্রয়োজন হয় যার জন্য একটি প্রয়োজন, যেমনstd::unique_ptrসদস্য) যেমন ফাংশন বা ভার্চুয়াল ফাংশন বা এই ধরণের কোনও কিছুর বিরুদ্ধে, এটি আপনার সমস্ত সাধারণ সি-স্টাইলের কোডিংকে সংজ্ঞায়িত আচরণের জন্য সংবেদনশীল re এটি হার্ব সাটার থেকে নিজে নিন:

memcpyএবং memcmpটাইপ সিস্টেম লঙ্ঘন। ব্যবহার memcpyবস্তু কপি করতে অর্থ উপার্জন একটি photocopier ব্যবহার ভালো হয়। memcmpবস্তুর তুলনা করতে ব্যবহার করা চিতাগুলির দাগগুলি গণনা করার সাথে তুলনা করার মতো। সরঞ্জামগুলি এবং পদ্ধতিগুলি কাজটি করার মতো হতে পারে তবে এটি গ্রহণযোগ্যভাবে করার জন্য তারা খুব মোটা। সি ++ অবজেক্টগুলি সমস্ত তথ্য গোপনের বিষয়ে রয়েছে (সফটওয়্যার ইঞ্জিনিয়ারিংয়ের পক্ষে সবচেয়ে লাভজনক নীতি; আইটেম 11 দেখুন): অবজেক্টগুলি ডেটা লুকায় (আইটেম 41 দেখুন) এবং কনস্ট্রাক্টর এবং অ্যাসাইনমেন্ট অপারেটরগুলির মাধ্যমে সেই ডেটা অনুলিপি করার জন্য সুনির্দিষ্ট বিমূর্ততা রচনা করেন (আইটেম 52 এর মাধ্যমে 55 দেখুন) । এই সমস্ত কিছুর উপরে বুলডোজিং তথ্য আড়ালকরণের memcpyমারাত্মক লঙ্ঘন এবং প্রায়শই স্মৃতি এবং সংস্থানসমূহের ফাঁস (সবচেয়ে ভাল), ক্র্যাশ (আরও খারাপ), বা অপরিজ্ঞাত আচরণের (সবচেয়ে খারাপ) - সি ++ কোডিং স্ট্যান্ডার্ডগুলির দিকে পরিচালিত করে।

সুতরাং অনেক সি বিকাশকারী এটির সাথে একমত নন এবং ঠিক তাই, কারণ দর্শণ কেবল তখনই প্রযোজ্য যদি আপনি সি ++ তে কোড লিখছেন। আপনি সম্ভবত হয় খুব সমস্যাযুক্ত কোড লেখা যদি আপনি চান ফাংশন ব্যবহার memcpyসব সময় কোডে সি ++ যেমন তৈরী করে যে , কিন্তু এটা পুরোপুরি ঠিক আছে যদি আপনি এটা করতে সি । টাইপ সিস্টেমের মধ্যে পার্থক্যের কারণে দুটি ভাষা এই ক্ষেত্রে খুব আলাদা। এই দু'টির সাধারণ বৈশিষ্ট্যগুলির সাবসেটটি দেখার জন্য এটি খুব লোভনীয় এবং বিশ্বাস করে যে একটিতে অন্যটির মতো ব্যবহার করা যেতে পারে, বিশেষত সি ++ পার্শ্বে, তবে সি + কোড (বা সি - কোড) সাধারণত সি এবং উভয়ের চেয়ে অনেক বেশি সমস্যাযুক্ত is সি ++ কোড।

তেমনিভাবে আপনাকে mallocসি-স্টাইলের প্রসঙ্গে (যা কোনও ইএইচ বোঝায় না) ব্যবহার করা উচিত নয়, যদি এটি সরাসরি কোনও সি ++ ফাংশন কল করতে পারে যা নিক্ষেপ করতে পারে, যেহেতু আপনার ফলস্বরূপ আপনার ফাংশনে একটি অন্তর্নিহিত পয়েন্ট রয়েছে ব্যতিক্রম যা আপনি কার্যকরভাবে সি-স্টাইল কোড রচনা করতে পারবেন না, freeসেই স্মৃতিতে সক্ষম হওয়ার আগে । তাই যখনই আপনি সি একটি সঙ্গে ++, তৈরী করে যে একটি ফাইল আছে .cppএক্সটেনশন বা যাই হোক না কেন ও এর মত জিনিস এই সব ধরনের কাজ করে malloc, memcpy, memset,qsort, ইত্যাদি, তারপর এটি সমস্যাটি আরও লাইনটিতে জিজ্ঞাসা করছে যদি না এটি ইতিমধ্যে যদি না থাকে তবে কেবলমাত্র আদিম ধরণের সাথে কাজ করে এমন একটি শ্রেণীর প্রয়োগের বিবরণ না হয়, যেখানে এখনও ব্যতিক্রম-নিরাপদ হওয়ার জন্য এটি ব্যতিক্রম হ্যান্ডলিংয়ের প্রয়োজন to আপনি সি ++ কোড লেখার তাহলে আপনি যদি এর পরিবর্তে সাধারণত RAII উপর নির্ভর করে এবং ভালো জিনিস ব্যবহার করতে চান vector, unique_ptr, shared_ptr, ইত্যাদি, এবং যখন সম্ভব সব স্বাভাবিক সি-শৈলী কোডিং এড়ানো।

আপনি সি এবং এক্স-রে ডেটা ধরণের রেজার ব্লেডের সাথে খেলতে পারেন এবং কোনও দলে কোলেটারাল ক্ষতির কারণ না হয়ে তাদের বিট এবং বাইটগুলি নিয়ে খেলতে পারেন (যদিও আপনি এখনও উভয় উপায়ে নিজেকে আঘাত করতে পারেন) এটি সি এর কারণ নয় প্রকারগুলি করতে পারে তবে তারা কখনই করতে সক্ষম হবে না তার কারণে। আপনি সি এর টাইপ সিস্টেমকে সি ++, সি, ডিটার এবং ভিটিবেলের মতো বৈশিষ্ট্যগুলি ব্যতিক্রম হ্যান্ডলিংয়ের সাথে অন্তর্ভুক্ত করার মুহুর্তটি সমস্ত ইডিয়োমেটিক সি কোড বর্তমানের চেয়ে অনেক বেশি বিপজ্জনক হিসাবে রেন্ডার করা হবে এবং আপনি নতুন ধরণের দেখতে পাবেন দর্শন এবং মানসিকতা বিকশিত যা কোডিংয়ের সম্পূর্ণ ভিন্ন স্টাইলকে উত্সাহিত করবে, যেমন আপনি সি ++ তে দেখেন যা এখন এমন কোনও শ্রেণীর জন্য কাঁচা পয়েন্টার অপব্যবহারকেও বিবেচনা করে যা স্মৃতি পরিচালনা করে, বলে, একটি RAII- অনুসারে সংস্থান হিসাবে পছন্দ করে না unique_ptr। সুরক্ষার নিখুঁত ধারণা থেকে সেই মানসিকতা বিকশিত হয়নি। এটা আউট প্রসূত কি সি ++ বিশেষভাবে মত বৈশিষ্ট্য বিরুদ্ধে নিরাপদ করা প্রয়োজন ব্যতিক্রম-হ্যান্ডলিং দেওয়া কি এটা নিছক পারবেন তার টাইপ সিস্টেমের মাধ্যমে।

ব্যতিক্রম-নিরাপত্তা

আবার, আপনি যে মুহূর্তে সি ++ জমিতে রয়েছেন, লোকেরা আপনার কোডটি ব্যতিক্রম-নিরাপদ বলে প্রত্যাশা করছে। লোকেরা ভবিষ্যতে আপনার কোডটি বজায় রাখতে পারে, এটি ইতিমধ্যে লিখিত এবং সি ++ তে সংকলিত হয়েছে এবং std::vector, dynamic_cast, unique_ptr, shared_ptrআপনার কোড দ্বারা প্রত্যক্ষ বা অপ্রত্যক্ষভাবে বলা কোডে সহজভাবে ব্যবহার ইত্যাদি কোড ব্যবহার করেছে , কারণ আপনার কোডটি ইতিমধ্যে "অনুমিত" সি ++ রয়েছে তাই এটি নির্দোষ বলে বিশ্বাস করে কোড। এই মুহুর্তে আমাদের জিনিসগুলি ফেলে দেওয়ার সম্ভাবনার মুখোমুখি হতে হবে এবং তারপরে আপনি যখন পুরোপুরি সূক্ষ্ম এবং সুন্দর সি কোডটি গ্রহণ করেন:

int some_func(int n, ...)
{
    int* x = calloc(n, sizeof(int));
    if (x)
    {
        f(n, x); // some function which, now being a C++ function, may 
                 // throw today or in the future.
        ...
        free(x);
        return success;
    }
    return fail;
}

... এখন ভেঙে গেছে। ব্যতিক্রম-সুরক্ষার জন্য এটি আবার লিখতে হবে:

int some_func(int n, ...)
{
    int* x = calloc(n, sizeof(int));
    if (x)
    {
        try
        {
            f(n, x); // some function which, now being a C++ function, may 
                     // throw today or in the future (maybe someone used
                     // std::vector inside of it).
        }
        catch (...)
        {
            free(x);
            throw;
        }
        ...
        free(x);
        return success;
    }
    return fail;
}

স্থূল! যে কারণে বেশিরভাগ সি ++ বিকাশকারীরা এর পরিবর্তে এটি দাবি করবে:

void some_func(int n, ...)
{
    vector<int> x(n);
    f(x); // some function which, now being a C++ function, may throw today
          // or in the future.
}

উপরেরটি হ'ল রেআইআই-কনফর্মিং ব্যতিক্রম-নিরাপদ কোডটি যা সি ++ বিকাশকারীরা সাধারণত অনুমোদন করবে যেহেতু ফাংশনটি কোনও ফাঁস করবে না যার ফলে কোন কোডের রেখাটি কোনও ফলাফলের ফলে অন্তর্নিহিত প্রস্থান শুরু করে throw

একটি ভাষা চয়ন করুন

আপনি সিআইএসের টাইপ সিস্টেম এবং দর্শনের সাথে আরআইআই, ব্যতিক্রম-সুরক্ষা, টেম্পলেট, ওওপি ইত্যাদির সাহায্যে আলিঙ্গন করতে হবে বা সিটিকে আলিঙ্গন করতে হবে যা মূলত কাঁচা বিট এবং বাইটের চারদিকে ঘোরে। এই দুটি ভাষার মধ্যে আপনার অপরিষ্কার বিবাহ করা উচিত নয় এবং এগুলি একসাথে ঝাপসা করার পরিবর্তে এটিকে আলাদা ভাষায় আলাদা করা উচিত।

এই ভাষাগুলি আপনাকে বিয়ে করতে চায়। আপনি সাধারণত ডেটিং এবং দু'জনের সাথে বোকা বানানোর পরিবর্তে একটি বেছে নেবেন। অথবা আপনি আমার মতো বহুবিবাহবিদ হতে পারেন এবং উভয়কেই বিবাহ করতে পারেন তবে একজনের সাথে একজনের সাথে সময় কাটাতে গিয়ে আপনার চিন্তাভাবনা সম্পূর্ণরূপে পরিবর্তন করতে হবে এবং একে অপরের থেকে ভালভাবে আলাদা থাকতে হবে যাতে তারা একে অপরের সাথে লড়াই না করে।

বাইনারি আকার

কৌতূহলের বাইরে আমি এখনই আমার নিখরচায় তালিকা বাস্তবায়ন এবং বেঞ্চমার্কটি নেওয়ার চেষ্টা করেছি এবং এটি সম্পর্কে C ++ তে পোর্টিং করার পরে যেহেতু আমি এ সম্পর্কে সত্যই কৌতূহল পেয়েছি:

[...] সি এর জন্য দেখতে কেমন তা জানেন না কারণ আমি সি সংকলকটি ব্যবহার করি না।

... এবং জানতে চাইছিল যে বাইনারি আকারটি কেবলমাত্র C ++ হিসাবে বিল্ডিংয়ে উত্সাহিত করবে। এটিকে আমার পুরো জায়গা জুড়ে স্পষ্ট কাস্ট ছড়িয়ে ছিটিয়ে দেওয়া দরকার ছিল যা ছিল পলাতক (একটি কারণ যা আমি আসলে নিম্নতর স্তরের জিনিস যেমন সিতে আরও ভাল বরাদ্দকারী এবং ডেটা স্ট্রাকচার লিখতে পছন্দ করি) তবে কেবল এক মিনিট সময় নিয়েছিল।

এটি কেবলমাত্র একটি সাধারণ কনসোল অ্যাপ্লিকেশনের জন্য এবং এমন কোনও কোডের সাথে একটি এমএসভিসি and৪-বিট রিলিজ বিল্ডের সাথে তুলনা করছিল যা কোনও সি ++ বৈশিষ্ট্য ব্যবহার করে না, এমনকি অপারেটর ওভারলোডিংও নয় - কেবল এটি সি ব্যবহার করে এবং বলার <cstdlib>পরিবর্তে <stdlib.h>এবং এর পরিবর্তে , বলুন, এই জাতীয় জিনিস, কিন্তু আমি এটি বাইনারি আকারের থেকে শূন্য পার্থক্য খুঁজে পেয়ে অবাক!

বাইনারিটি 9,728যখন সিটিতে নির্মিত হয়েছিল তখন বাইটস ছিল এবং 9,278তেমনিভাবে ব + বাইটগুলি সি ++ কোড হিসাবে সংকলিত করার সময় ছিল। আমি আসলে এটি আশা করিনি। আমি ভেবেছিলাম EH এর মতো জিনিসগুলি সেখানে কমপক্ষে কিছুটা যোগ করবে (ভেবেছিল এটি কমপক্ষে একশ বাইটের মতো আলাদা হবে), যদিও সম্ভবত এটি ঠিক করতে পেরেছেন যে আমি ঠিক যেহেতু ইএইচ-সম্পর্কিত নির্দেশ যুক্ত করার দরকার নেই was সি স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে এবং কিছুই ছোঁড়ে না। আমি কিছু ভেবেছিআরটিটিআই-র মতো বাইনারি আকারে কিছুটা হলেও যুক্ত করা হবে। যাইহোক, এটি দেখতে দারুণ লাগছিল। অবশ্যই আমি মনে করি না আপনি এই একটি ফলাফল থেকে সাধারণীকরণ করা উচিত, তবে এটি কমপক্ষে আমাকে কিছুটা মুগ্ধ করেছে। এটি মানদণ্ডগুলিতেও কোনও প্রভাব ফেলেনি এবং স্বাভাবিকভাবেই, যেহেতু আমি কল্পনা করি যে একইরকম ফলস্বরূপ বাইনারি আকারের অর্থ একই রকমের ফলস্বরূপ মেশিনের নির্দেশাবলীও ছিল।

এটি বলেছিল, উপরে বর্ণিত সুরক্ষা এবং প্রকৌশল সংক্রান্ত সমস্যাগুলির সাথে বাইনারি আকারের বিষয়ে কে যত্নশীল? সুতরাং, আবার কোনও ভাষা বেছে নিন এবং এর দর্শনকে জটলা করার পরিবর্তে আলিঙ্গন করুন; এটাই আমি সুপারিশ করি।

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